Я пытаюсь разобраться в некоторых проблемах с памятью на 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
поделился адресом адрес важного участника, удалив его также важным членом? Я знаю, что есть довольно много вопросов, но я думаю, что я просто кругом спорю в голове, все больше и больше запутываю себя.
Вы назначили intPtr с 'new int [n];', поэтому вы должны освободить его с помощью delete []. См. [Документация] (http://www.cplusplus.com/reference/new/operator%20delete [] /). – user2079303
Угадайте, пожалуйста, о usecase: вам, скорее всего, нужно явно «удалить» каждый элемент 'vecPtr' и предоставить конструктор/назначение копии, который скопирует содержимое указателей для использования в целевом векторе. – qwm
Вы должны «удалить» все, что вы создали, с помощью 'new'. –