对象的动态内存和赋值运算符重载

Posted

技术标签:

【中文标题】对象的动态内存和赋值运算符重载【英文标题】:Dynamic Memory and assignment operator overloading of objects 【发布时间】:2015-06-25 18:42:21 【问题描述】:

如果我在动态内存中使用赋值运算符重载,我应该检查指针内是否已经有东西吗?

例如,如果对象 A 在构造函数中为名为“name”的数组分配了动态内存。

存储在对象A中的是名字“John”,在构造函数中通过分配内存

name = new char[strlen(userinput)+1];

如果我想通过赋值运算符重载将对象 B 复制到对象 A 中,我必须编写

if(name != null)delete [] name;
name = new char[strlen(src.name)+1];

先清除数组还是在重新分配内存之前不必删除名称?

【问题讨论】:

每个new[] 一个delete[],不需要空检查。 如果您要处理动态分配的内存,可能需要解决的问题比您要求的要多。我强烈建议您使用std::vector<char> 而不是自己挣扎new/delete @user3551329 你实际上不必测试if(name != nullptr),因为删除nullptr 是无操作的。 delete[] name; 应该可以。 【参考方案1】:

“要先清空数组还是在重新分配内存之前不必删除名称?”

这样,您必须始终注意内存管理和取消/分配。你必须遵守复制结构和分配(参见What is the Rule of Three?)。

if(name != nullptr)delete [] name;
        // ^^^^^^^ The correct term is nullptr

您必须自己管理nullptr 值。 delete/delete [] 不要自动分配 nullptr 值,而是给你一个 dangling pointer


与其自己管理动态分配的内存相比,更好的解决方案是使用适当的容器类,例如std::vector<char>std::string

class A 
    std::string name;
;

【讨论】:

以上是关于对象的动态内存和赋值运算符重载的主要内容,如果未能解决你的问题,请参考以下文章

C++学习31 重载=(赋值运算符)

c++中拷贝构造函数和赋值运算符重载本质上一样么

c++中为啥赋值运算符重载返回类型是引用

C++重载赋值运算符

C++重载赋值运算符

赋值函数(运算符重载)