对象的动态内存和赋值运算符重载
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;
;
【讨论】:
以上是关于对象的动态内存和赋值运算符重载的主要内容,如果未能解决你的问题,请参考以下文章