安全复制对象的替代方案

Alternatives for safely copying objects

本文关键字:方案 复制 对象 安全      更新时间:2023-10-16

我发现在不处理复制构造函数的情况下,很难找到一个关于安全复制新类对象的在线引用。我正在为一个名为"CLabel"的子类开发构造函数方法,教授对这个特定构造函数的逻辑(这是3个构造函数中的第一个)的评论如下:

"这个构造可以安全地复制CLabel,以保证没有内存泄漏。">

功能标题如下:

CLabel::CLabel(const CLabel& L)

现在看看类本身的上下文,它的声明中没有显式的数据成员。因此,我现在的问题是,如何对通过引用传递的不包含数据成员的类实例进行深度复制。

到目前为止,我已经破解了它——它进行了编译,但visual studio发现了一个异常——"t1.exe中0x770F380B(ntdll.dll)处未处理的异常:0xC0000374:堆已损坏(参数:0x7710CDD8)。":

*this = L;
int l = L.width();
this->_data = new char[l+1];
int i = 0;
for(; i < l; i++)
((char*)_data)[i] = ((char*)L._data)[i];
((char*)_data)[i] = '';

在测试程序文件中的这一行发现了异常:

int mesIndx = D.add(new CLabel(7, 5, 40));

对于这个特定任务的任意上下文,API的文档位于http://zenit.senecac.on.ca/wiki/index.php/The_CUI_Framework_-_OOP344_20132#CLabel

谢谢大家。

我认为老师的评论是关于这样一个事实,即如果你必须创建一个缓冲区来复制CLabel的内容,那么你必须确保它在最后会被销毁。

例如:如果CLabel有一个类似"char*"的成员和一个大小您必须创建一个新的缓冲区(malloc),并且不要忘记删除。

更简单的解决方案是设计带有std::string成员的CLabel类,该成员将自动管理缓冲区并分配释放内存,避免任何内存泄漏

这个头描述了一个复制构造函数,所以如果要实现它,那么您需要查看在复制构造函数上找到的文档。一般来说,它们是在C++中复制对象的正确方法。

至于他所说的防止内存泄漏是什么意思,我必须更多地了解这项任务。复制构造函数的目的通常是防止内存泄漏,即双重删除/悬挂指针。