C++ 为什么向量指针';内存自动清除

C++ 为什么向量指针';内存自动清除,c++,pointers,vector,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->a

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());
类测试{
公众:
std::vector*num;
int*n;
};
测试*t=新测试();
t->num=新标准::向量;
t->num->assign(10,10);
t->n=新整数[20];
t->n[0]=12345;
int*testN=t->n;
std::vector*testV;
testV=t->num;
删除t;
//我可以打印n的记忆
printf(“%d\n”,testN[0])//获取12345,所以内存在这里泄漏。
//我无法打印num的内存;它的大小是0。在发行版中,它是负数。
printf(“%d\n”,testV->size());
删除t后,我看到指向的内存num被清除,在我的VS10环境中,我可以看到它的内存被清除为“ee-fe-ee-fe…”。 但是n的记忆保持不变

在我看来,所有的内存都来自关键字new,应该通过delete释放,这里是num(vector) 不是“删除”,而是自动清除


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

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


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

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


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

调试运行时将使用eefe等标记覆盖它删除的内存,以检测释放后使用等错误。发布版本无法做到这一点


您可能只是误读了调试输出。向量*和int*内存仍然存在。调试器可能只是在尝试更智能地处理向量。

调试运行时将使用诸如eefe之类的标记覆盖它删除的内存,以检测诸如释放后使用之类的错误。发布版本无法做到这一点


您可能只是误读了调试输出。向量*和int*内存仍然存在。调试器可能只是想更聪明地处理向量。

如果要正确执行此操作,需要
删除[]t->n
删除t->num在执行之前
删除t-但更正确的方法是“正确”使用面向对象,让
t
的构造函数和析构函数处理
n
num
的内存分配和释放,这样可以自动为类本身正确管理内存


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

如果要正确执行此操作,需要
删除[]t->n
删除t->num在执行之前
删除t-但更正确的方法是“正确”使用面向对象,让
t
的构造函数和析构函数处理
n
num
的内存分配和释放,这样可以自动为类本身正确管理内存


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

指向向量的指针没有什么不同。尽管调试器可能会让您相信什么,但您仍然必须在这个新指针上调用
delete
。您的测试没有用任何初始值填充向量,所以当然
testV->size()
将为0。对不起,我现在填充了它,它(大小)是负数,所以我猜内存是自动清理的?我只是不明白为什么它不再是10,如果这个内存泄漏了,它应该保持不变吗?
vector::size\u type
是否正确地打印为
int
?如果改用
cout
,会发生什么情况?我刚刚尝试了你的示例,无法重现你描述的行为。指向向量的指针没有什么不同。尽管调试器可能会让您相信什么,但您仍然必须在这个新指针上调用
delete
。您的测试没有用任何初始值填充向量,所以当然
testV->size()
将为0。对不起,我现在填充了它,它(大小)是负数,所以我猜内存是自动清理的?我只是不明白为什么它不再是10,如果这个内存泄漏了,它应该保持不变吗?
vector::size\u type
是否正确地打印为
int
?如果你用
cout
来代替,会发生什么?我刚刚试过你的例子,我无法重现你描述的行为。我刚刚编辑了我的问题,我确实可以检查内存。我最初是通过内存间谍工具来实现的,在vs2010中,alt+6可以实现。现在,在我的新代码中,我用另一个指针检查它们。它们的行为与我在VS2010中描述的一样,因为没有释放
t->n
,所以在释放
t
后,内存分配将保持不变,是的。
t
中的指针被覆盖(在调试版本中)。释放后使用
t
中的任何内容都是“未定义的行为”,这意味着它可能无法按照您的预期工作-无论您预期如何。我还认为t->num(向量指针)应该会导致泄漏,但在我的测试中,它看到了