释放容器成员的内存 我试图澄清我对C++中一些内存问题的理解,主要是包含指针的容器。假设我有这样的东西:

释放容器成员的内存 我试图澄清我对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();

标题.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
\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 不是指针。基于这一点,这似乎是个坏名字。