安全复制对象的替代方案

时间:2012-11-15 23:08:17

标签: c++ memory-management memory-leaks copy-constructor

我发现很难找到一个关于安全复制新类对象的在线参考,而不需要处理复制构造函数。我正在研究一个名为'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] = '\0';

在测试文件中的这一行抓住了异常:

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

对于此特定作业的上下文,API的文档位于http://zenit.senecac.on.ca/wiki/index.php/The_CUI_Framework_-_OOP344_20132#CLabel

谢谢大家。

2 个答案:

答案 0 :(得分:0)

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

ex: 如果你CLabel有一个像'char *'和一个大小的成员 你必须创建一个新的缓冲区(malloc),不要忘记删除。

Easyer解决方案是使用std :: string成员设计CLabel类,该成员将自动管理缓冲区并分配释放内存以避免任何内存泄漏

答案 1 :(得分:0)

该标头描述了一个复制构造函数,因此,如果要实现它,那么您需要查看在复制构造函数中找到的文档。通常,它们是用C ++复制对象的正确方法。

至于他通过防止内存泄漏的含义,我必须更多地了解这项任务。复制构造函数的目的通常是防止内存泄漏,双删除/悬空指针的相反。