c++ - 处理类 new 和删除运算符 C++ 中的内存泄漏

标签 c++ memory-management memory-leaks

我很喜欢在 C++ 中使用运算符 newdelete,但稍后在程序代码中调用 delete 时经常会遇到问题。

例如,在以下代码中:

class Foo {
public:
    string *ace;
    Foo();
    ~Foo();
};
Foo::Foo() {
    ace = new string;
}
Foo::~Foo() {
    delete ace;
}
void UI::ButtonPressed() { //Happens when an event is triggered
    Foo *foo = new Foo;
    ui->label = ace; //Set some text on the GUI
    delete foo; //Calls the destructor, deleting "ace" and removing it from the GUI window
}

我可以声明一个字符串,但是当我删除它时,它会从 GUI 表单中删除该值,因为该字符串现已被删除。

有没有办法让我稍后以某种方式删除这个分配的字符串?

我不想将其声明为全局变量,然后在程序源代码的最后一行删除它。我永远不能调用delete,但据我所知,这是不好的,会导致内存泄漏。

最佳答案

您应该阅读 RAII pattern 。这是 C++ 程序员需要了解的最重要的概念之一。

基本思想是资源(新对象、HTTP 连接等)的生命周期与对象的生命周期相关。这是编写异常安全代码所必需的。

在您的情况下,UI 小部件将复制该对象并在其自己的析构函数中释放它。然后,调用代码可以立即释放其拷贝(在另一个析构函数中)。

关于c++ - 处理类 new 和删除运算符 C++ 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9247225/

相关文章:

c++ - 如何从多个纹理(C++、SDL 2)的一部分创建一个位图?

C realloc不改变字符数组的表观大小

ruby - Ruby 的 GC.stat 字段是什么意思?

php - 我的脚本中是否存在内存泄漏,或者是另一个罪魁祸首?

c++ - 在不使用 + 或 - 的情况下添加二进制整数

c++ - 创建类的过程涉及虚继承

c++ - 使用 WGL 创建现代 OpenGL 上下文?

java - Java中的内存主机和内存参数xms和xmx之间的关系

javascript - AngularJS 闭包内存泄漏?

android - 修复由 Leak Canary 发现的 Activity 内存泄漏