【问题标题】:Alternatives for safely copying objects安全复制对象的替代方法
【发布时间】:2023-03-12 22:54:02
【问题描述】:

我发现很难找到关于在不处理复制构造函数的情况下安全复制新类对象的在线参考。我正在为一个名为“CLabel”的子类开发一个构造函数方法,教授的 cmets 用于这个特定构造函数的逻辑(这是 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

谢谢大家。

【问题讨论】:

  • 如果没有看到更多 CLabel 代码,就很难说出任何事情。

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


【解决方案1】:

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

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

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

【讨论】:

  • 更简单的解决方案是设计带有 std::string 成员的 CLabel 类,该成员将自动管理缓冲区并分配释放内存以避免任何内存泄漏你能推荐我吗?我该怎么办?
  • 一切都取决于你的锻炼要求,但你可以或自己持有和管理字符串作为你自己分配并释放自己的 char * 缓冲区。或者,如果您有权使用标准库,请使用 std::string #include 。使用见cplusplus.com/reference/string/string,它是std库的一个类,将为您保存和管理缓冲区
  • 我确实可以,我在其他方法中使用了 std::str.clear() 。谢谢!
  • @learnenburn 重要的一点是,如果您使用 std::string 那么您就不需要需要编写复制构造函数。在字里行间阅读我不完全确定你的教授理解这一点。但正如已经说过的,如果您发布代码会更容易。
  • 查看我在回复 Alexander 评论时发送的链接,它描述了整个项目
【解决方案2】:

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

至于他所说的防止内存泄漏是什么意思,我必须了解更多关于分配的信息。复制构造函数的目的往往是防止内存泄漏的反面,双重删除/悬空指针。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多