为什么即使删除后std :: string也会导致类中的内存泄漏

格雷迪

我正在建立一个使用void *作为存储方法的类。我知道使用void *不是一个好主意。但是我不知道在编译时它将具有什么价值,所以我认为这是最好的解决方案。它适用于所有内容,包括C字符串,但不适用于std :: string。这会导致非常严重的内存泄漏。我建立了具有相同问题的类的基本模型。

#include<iostream>
#include<string>

class CLASS {
public:
    void* data;

    CLASS(std::string str) {
        std::string* s = new std::string;
        *s = str;
        data = s;
    }

    ~CLASS() {
        delete data;
    }
};

int main() {
    std::string str = "hi";
        while (true)
        {
            CLASS val(str);
        }
}
紫罗兰色

如果分配了string,将指针转换为void *,然后删除该指针则将尝试删除一个void东西,而不是一个string东西。例如,任何分配辅助存储的类(在使用所创建的实际对象之上和之外new)都很可能会遇到麻烦:

#include <iostream>

class Y {
public:
    Y() { std::cout << "y constructor\n"; }
    ~Y() { std::cout << "y destructor\n"; }
};

class X {
public:
    X() { std::cout << "x constructor\n";  y = new Y(); }
    ~X() { delete y; std::cout << "x destructor\n"; }
private:
    Y *y;
};

int main() {
    X *x = new X();
    delete (void*)x;
}

此代码在合法的情况下将“起作用”,但不会达到您的期望:

x constructor
y constructor

一个不错的编译器应该警告您:

program.cpp: In function ‘int main()’:
program.cpp:19:19: warning: deleting ‘void*’ is undefined [-Wdelete-incomplete]
   19 |     delete (void*)x;
      |                   ^

您应该删除分配的类型,以确保使用正确的析构函数。换句话说,摆脱上面显示的代码中delete的强制类型转换(以便您使用正确的类型)会更好:

x constructor
y constructor
y destructor
x destructor

现代C ++具有类型安全的类型,这些类型将为您带来繁重的工作,例如variantany(如果您的单个类需要存储运行时决定的各种类型)或模板(如果可以用于一种类型,任何一种)。您应该调查这些内容以替代void *

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

是否有为什么会AccessibilityManager.sInstance导致内存泄漏的一个原因?

如果重置了回调,为什么静态Drawable会导致Android泄漏内存?

为什么使用“ new”会导致内存泄漏?

为什么Objective-C中的“ try catch”会导致内存泄漏?

为什么此Observable.Generate过载会导致内存泄漏?[使用Timespan <15ms]

为什么C#中的Lambda表达式会导致内存泄漏?

即使删除对象后,Python struct.pack也会导致内存泄漏

std :: string中的内存泄漏

为什么subdataWithRange导致任何NSThread中的内存泄漏?

为什么使用QtConcurrent在另一个线程中读取图像似乎会导致内存泄漏?

如果引用仍然存在,是否不会在析构函数中删除指针会导致内存泄漏?

为什么将列表附加到其自身然后删除会导致内存泄漏

为什么重复调用FileOpenDialog会导致内存泄漏?

为什么基本的Swift代码会导致内存泄漏?

为什么Node.js中的全局数组会导致内存泄漏?

在ArrayList的add()方法中创建新对象会导致内存泄漏。我可以做些什么?

为什么嵌套的initializer_list会导致内存泄漏

从向量中删除值导致的内存泄漏

iOS-可能会删除nsmutablearray导致内存泄漏?

为什么此功能会导致内存泄漏?

为什么此JavaScript会导致内存泄漏?

为什么用CGImageSource加载gif会导致内存泄漏?

为什么类型化数组会导致JavaScript中的内存泄漏

为什么使用 make_unique<> 将函数传递给线程会导致 Valgrind 中的内存泄漏?

为什么调用堆栈数组会导致内存泄漏?

为什么指向同一个内存的多个共享指针会导致内存泄漏?

为什么这个函数会导致内存泄漏?

为什么这个二进制输出代码会导致内存泄漏

为什么 axios 拦截器中存在授权令牌,即使删除令牌后?