0

我发现很难找到关于安全复制新类对象而不处理复制构造函数的在线参考。我正在为一个名为“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

感谢大家。

4

2 回答 2

0

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

例如:如果你的 CLabel 有一个像 'char *' 这样的成员和一个大小你将不得不创建一个新的缓冲区(malloc)并且不要忘记删除。

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

于 2012-11-15T23:16:57.657 回答
0

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

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

于 2012-11-15T23:31:21.850 回答