为什么矢量指针的内存会自动清除

时间:2013-06-29 08:51:30

标签: c++ pointers vector

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,应该通过删除释放,好吧,这里的num(vector)是 不是'删除,而是自动清除。

我想知道矢量指针与其他指针有什么不同?

3 个答案:

答案 0 :(得分:3)

仅释放t个内存,成员numn指向的是内存泄漏。

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

答案 1 :(得分:2)

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

您可能只是误读了调试输出。 vector *和int *内存仍然存在。调试器可能只是试图更聪明地使用矢量。

答案 2 :(得分:1)

如果您想要正确执行此操作,则需要delete [] t->n;delete t->num;才能执行delete t; - 但更正确的方法是“正确”使用面向对象,让t的构造函数和析构函数处理内存分配并释放nnum - 自动地,为类本身正确管理内存。

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