我正在尝试清理我对C ++中一些内存问题的理解,主要是使用包含指针的容器。说我有这样的事情:
Header.H
#ifndef test_Header_h
#define test_Header_h
#include <vector>
using std::vector;
class ClassA {
int* intPtr;
public:
ClassA(int n);
~ClassA();
};
class ClassB {
vector<ClassA*> vecPtr;
public:
ClassB();
~ClassB();
void someFunc();
};
#endif
的main.cpp
#include <iostream>
#include "Header.h"
int main(int argc, const char * argv[])
{
ClassA objA(5);
ClassB objB;
return 0;
}
ClassA::ClassA(int n) {
intPtr = new int[n];
}
ClassA::~ClassA() {
delete intPtr;
}
ClassB::ClassB() {
vecPtr = vector<ClassA*>(0);
}
ClassB::~ClassB() {
//no destructor needed
}
void ClassB::someFunc() {
//vecPtr = something using new;
int* testPtr = new int[vecPtr.size()];
//do stuff
delete testPtr;
}
是否需要删除vecPtr
?或者ClassA
的析构函数是否为我完成了这个?另外,如果我使用了vector
指针或list
,那么如果不是pair
,那么情况是否相同?最后,为了澄清testPtr
需要在someFunc
中删除,因为这是它声明的范围,因此将它放在析构函数中将毫无意义。如果testPtr
共享一个重要成员的地址,删除它也是重要成员?我知道有很多问题,但我认为我只是在脑海中循环论证,让自己越来越困惑。
答案 0 :(得分:2)
vecPtr
不需要删除,因为它不是指针。这可能与vecPtr
中的指针不同,取决于谁拥有这些指针的所有权。
是的,testPtr
必须在可用的地方删除。其他任何东西都不会编译。如果您将testPtr
指向某个成员并将其删除,则在析构函数中删除该成员时,您可能会看到双重释放或损坏错误。
一般情况下,必须删除的内容取决于实现。您需要注意的唯一事情是每个新的从任何代码路径中的某个位置获得一个删除。通常,构造函数/析构函数是一个好地方。
答案 1 :(得分:0)
你这里有很大的问题。记住这个:
1)任何new
必须与delete
平衡。
2)任何new[]
必须与delete[]
平衡。
事实上,如果你混合它们(正如你所做的那样),你就会有未定义的行为。 热潮!您需要撰写delete[] intPtr;
和delete[] testPtr;
另外,简单地说,你没有写delete vecPtr
,因为你没有写new vecPtr
。
在内部,C ++运行时会记住使用new[]
分配的元素数。您需要使用delete[]
来允许该运行时访问该信息。