虚方法、new和delete

本文通过一个C++程序示例介绍了面向对象编程的基本概念,包括类的定义、继承和多态性的实现。示例中创建了一个抽象的Company基类,并派生出了具体的TechCompany子类,展示了如何使用多态特性进行编程。
#include <iostream>
#include <string>
using namespace std;
class Company
{
public:
    Company(string);
    virtual ~Company();
    virtual void work(void);
protected:
    string name;
};
class TechCompany : public Company
{
public:
    TechCompany(string, string);
    ~TechCompany();
    void work(void);
private:
    string product;
};

Company::Company(string name)
{
    this -> name = name;
    cout << name << "公司诞生了!" << endl;
}
Company::~Company()
{
    cout << name << "公司倒闭了!" << endl;
}
TechCompany::TechCompany(string name, string product) : Company(name)
{
    this -> product = product;
    cout << name << "科技公司诞生了!" << endl;
}
TechCompany::~TechCompany()
{
    cout << name << "科技公司倒闭了!" << endl;
}
void TechCompany::work(void)
{
    cout << name << "公司开始工作了,生产了" << product << "产品。" << endl;
}
void Company::work(void)
{
    cout << name << "公司开始工作了!" << endl;
}

int main()
{
    Company *company;
    company = new Company("Microsoft");
    company -> work();
    delete company;

    company = new TechCompany("Apple", "Phone");
    company -> work();
    delete company;
    return 0;
}

 

<think>好的,用户想了解C++中newdelete运算符的正确使用方法,并需要示例。我需要先回顾一下相关的知识点,确保回答准确。首先,new用于动态分配内存,delete用于释放内存,这是基础。然后要提到配对使用的重要性,避免内存泄漏。可能还需要覆盖数组的情况,比如使用new[]delete[]。此外,用户提供的引用资料里提到了一些细节,比如析构函数的调用全局运算符的使用,这些也要整合进去。 用户可能对基本用法比较熟悉,但或许不清楚一些常见错误,比如不匹配使用newdelete[],或者忘记释放内存导致泄漏。示例部分应该包括基本类型、对象、数组以及二维数组的情况,这样能全面展示不同场景下的正确用法。还要注意提醒使用智能指针来避免手动管理的问题,这符合现代C++的最佳实践。 另外,引用资料中提到,即使类定义了自身的new运算符,仍然可以使用全局的,比如::new,这可能是一个高级用法,可以简单提及。需要确保示例代码语法正确,并且注释清晰,帮助用户理解每一步的作用。最后,常见问题部分需要涵盖内存泄漏、悬空指针、异常安全等,这些都是使用newdelete时容易遇到的坑。 总结一下,回答的结构应该是:基本语法、正确用法步骤、示例代码(各种情况)、注意事项、常见错误及避免方法,最后相关问题。这样用户能逐步理解并正确应用这些运算符。同时要确保引用资料中的信息被正确引用,比如关于析构函数全局运算符的部分。</think>### C++中new/delete运算符使用指南 一、基础语法特性 1. 基本配对关系 - `new`运算符:动态分配单个对象内存`T* ptr = new T;`或数组`T* arr = new T[N];` - `delete`运算符:释放单个对象`delete ptr;`或数组`delete[] arr;`[^3] 2. 内存操作流程 ```cpp // 内存分配时执行的操作序列 operator new() // 分配原始内存 构造函数 // 对象初始化 // 内存释放时执行的操作序列 析构函数 // 对象清理 operator delete() // 释放内存 ``` 二、正确使用步骤 1. 单个对象操作 ```cpp // 分配并初始化int对象 int* num = new int(10); // 使用后释放 delete num; // 正确配对 ``` 2. 对象数组处理(注意数组语法) ```cpp // 分配包含5个MyClass对象的数组 MyClass* arr = new MyClass[5]; // 必须使用数组删除器 delete[] arr; // 正确配对[^2] ``` 3. 二维数组示例 ```cpp // 分配3x4整型数组 int** matrix = new int*[3]; for(int i=0; i<3; ++i) matrix[i] = new int[4]; // 释放内存(逆序) for(int i=0; i<3; ++i) delete[] matrix[i]; delete[] matrix; ``` 三、关键注意事项 1. 强制配对规则 - `new`与`delete`必须严格配对使用 - `new[]`必须对应`delete[]`,否则会导致未定义行为[^3] 2. 异常安全实践 ```cpp MyClass* obj = nullptr; try { obj = new MyClass; // 使用对象 } catch(...) { delete obj; // 异常时清理 throw; } delete obj; ``` 3. 现代C++改进方案(推荐替代方案) ```cpp // 使用智能指针自动管理 std::unique_ptr<MyClass> smartPtr(new MyClass); // 自动调用delete,无需手动释放 ``` 四、常见错误示例 1. 内存泄漏案例 ```cpp void leaky_func() { int* p = new int(5); // 没有调用delete } // 每次调用泄漏4字节 ``` 2. 悬空指针问题 ```cpp int* p = new int(10); delete p; *p = 20; // 危险!已释放内存的访问 ``` 3. 错误类型删除 ```cpp Base* b = new Derived; // 多态对象 delete b; // 需要虚析构函数 ``` 五、高级应用场景 1. 自定义内存分配器 ```cpp class CustomAlloc { public: void* operator new(size_t size) { std::cout << "Custom allocation\n"; return ::operator new(size); // 使用全局new[^4] } void operator delete(void* p) { std::cout << "Custom deallocation\n"; ::operator delete(p); } }; ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值