0

BS:我已经测试过,下面的问题是VS2010特有的,在我对Mingw的测试中,向量内存泄漏, printf("%d\n", testV->size()); 给我'10',这表明它是一个泄漏。

在如下代码中:

class Test{
public:
    std::vector<int> *num;
    int *n;
};

Test *t = new Test();
t->num = new std::vector<int>;
t->num->assign(10,10);
t->n = new int[20];
t->n[0] = 12345;
int *testN = t->n;
std::vector<int> *testV;

testV = t->num;
delete t;

//I can print n's memory
printf("%d\n", testN[0]);  //get 12345, so memory leaked here.

//I can't print num's memory; its size is 0. in release version, it's negative number.
printf("%d\n", testV->size());

删除 t 后,我​​看到内存 num 指向被清除,在我的 VS10 环境中,我可以看到它的内存被清除为 'ee fe ee fe....'。但是 n 的记忆保持不变。

在我看来,所有内存都来自关键字new,应该通过delete来释放,好吧,这里的num(向量)不是'delete'd,而是自动清除。

我想知道向量指针与其他指针有何不同?

4

3 回答 3

3

只有t的内存被释放,成员numn指向的是泄漏的内存。

您的测试是错误的,因为您在删除它后无法检查t,并且没有其他方法可以访问这些成员(因此泄漏)。

于 2013-06-29T09:01:26.653 回答
2

调试运行时将使用 eefe 之类的标记覆盖它删除的内存,以检测诸如 use-after-free 之类的错误。发布版本不会这样做。

您可能只是误读了调试输出。vector* 和 int* 内存仍然存在。调试器可能只是想对向量更智能。

于 2013-06-29T09:02:47.723 回答
1

如果你想正确地做到这一点,你需要在你做之前delete [] t->n;-但更正确的方法,“正确”使用面向对象,是让构造函数和析构函数处理内存分配和释放- 这样,自动地,为类本身正确管理内存。delete t->num;delete t;tnnum

我还要指出,使用指向 a 的指针很少是正确的std::vector——向量本身并不占用那么多空间,所以你可能应该使用std::vector<int> num;而不是指向它的指针。这也意味着它num会在析构函数中自动销毁,而不需要任何额外的代码。

于 2013-06-29T09:09:36.360 回答