释放容器成员的内存 我试图澄清我对C++中一些内存问题的理解,主要是包含指针的容器。假设我有这样的东西:
标题.H释放容器成员的内存 我试图澄清我对C++中一些内存问题的理解,主要是包含指针的容器。假设我有这样的东西:,c++,pointers,memory,delete-operator,C++,Pointers,Memory,Delete Operator,标题.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();
#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
\ifndef测试头\u h
#定义测试头
#包括
使用std::vector;
甲级{
int*intPtr;
公众:
甲级(int n);;
~ClassA();
};
B类{
向量向量PTR;
公众:
类别b();
~ClassB();
void someFunc();
};
#恩迪夫
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;
}
#包括
#包括“Header.h”
int main(int argc,const char*argv[]
{
a类objA(5);
B类objB;
返回0;
}
ClassA::ClassA(int n){
intPtr=新的int[n];
}
ClassA::~ClassA(){
删除intPtr;
}
ClassB::ClassB(){
vecPtr=向量(0);
}
ClassB::~ClassB(){
//不需要析构函数
}
void ClassB::someFunc(){
//vecPtr=使用新的东西;
int*testPtr=newint[vecPtr.size()];
//做事
删除testPtr;
}
vecPtr
是否需要删除?还是ClassA
的析构函数为我完成了这个任务?另外,如果不是使用向量
,而是使用列表
指针或对
,情况是否会相同?最后,为了澄清,需要在someFunc
中删除testPtr
,因为这是它声明的范围,所以将它放在析构函数中是没有意义的。如果testPtr
共享了一个重要成员的地址,那么删除它也会影响到该重要成员吗?我知道有很多问题,但我想我只是在头脑中循环争论,让自己越来越困惑 你这里有大问题。记住这一点:
1) 任何新的都必须用删除来平衡
2) 任何new[]
必须与delete[]
平衡
事实上,如果你把它们混合在一起(就像你做的那样),你就有了未定义的行为轰您需要编写delete[]intPtr代码>和删除[]testPtr代码>
同样简单地说,您没有编写删除vecPtr
,因为您没有编写新的vecPtr
内部,C++运行时记住使用“代码> NeX[]/CODE >分配的元素数。您需要使用
delete[]
来允许运行时访问该信息。vecPtr
不需要删除,因为它不是指针。这对于vecPtr
中的指针可能不同,这取决于谁拥有这些指针的所有权
是的,testPtr
必须在可用时删除。其他任何东西都无法编译。如果将testPtr
指向某个成员并将其删除,则在析构函数上删除该成员时,可能会看到双重释放或损坏错误
通常,必须删除的内容由实现决定。您需要注意的唯一一件事是,每个新代码都会从任何代码路径中的某个位置恰好得到一次删除。因此,通常构造函数/析构函数是一个很好的位置。您已经使用newint[n]分配了intPtr代码>因此您应该使用delete[]解除对其的分配。参见。猜测用例:您很可能必须明确地删除每个vecPtr
元素,并提供复制构造函数/赋值,复制目标向量中使用的指针内容。您必须<代码>删除< /代码>创建的任何代码> < <代码> >。考虑使用<代码> STD::SyrdYPPTR <代码> />代码:STD::UNIQUIGYPTR 而不是原始指针<代码> VECPTR 不是指针。基于这一点,这似乎是个坏名字。