현재 작업하고있는 프로그램에서 std::vectors
을 포함하는 개체가 있습니다. 이러한 개체를 삭제하려고하면 개체가 메모리에서 해제되지 않고 문제가 발생합니다.std :: vector를 포함하는 개체의 메모리를 해제하는 방법
이 프로그램을 테스트하기 위해 최소한의 프로그램을 만들었으므로이 프로그램에서도 제대로 작동하지 않습니다.
다음은 내가 테스트했던 프로그램입니다.
#include<iostream>
#include<vector>
struct node{
std::vector<int> list;
bool isParent;
struct node* child;
~node(){
delete[] child;
}
node(){
isParent = false;
list.push_back(5); // comenting this line would make it work correctly
}
void divide_r(){
if (isParent){
for(int i = 0; i < 8; i++){
(child+i)->divide_r();
}
}else{
node *c;
c = new node[8];
child = &c[0];
isParent = true;
}
}
};
int main(){
node *root = new node;
for(int i = 0; i < 8; i++){
root->divide_r();
}
delete root;
sleep(10);
return 0;
}
벡터에 아무 것도 넣지 않으면 메모리를 확보 할 수 없습니다.
우분투에서 g ++을 사용하고 있습니다. 틀린 일을하고 있습니까, 아니면이 일을해야합니까?
나는 또한 소멸자의 "목록"에서 메모리를 비우는 데 여러 가지 방법을 사용하려고했지만 "목록"이 범위를 벗어나면 어쨌든 해제해야한다고 생각합니다.
프로그램은 약 1.4GB의 RAM을 사용하지만 잠자기 후 프로그램이 종료되기 전에는 아무 것도 해제되지 않습니다.
왜 *은'child' 멤버 * 아닌'list' 구성원에 대한 벡터를 사용하고 있습니까? –
그건 보통의 것입니다. 해제 된 메모리는 OS에 즉시 반환되지 않지만 할당자가 유지합니다. 따라서 메모리 사용이 즉각적으로 줄어들지는 않습니다. –
설정은 테스트 일 뿐이므로 여기서는 문제가되지 않습니다. 내가 Matteo보다 정확하게 이해한다면, 필요할 때 메모리를 해제해야합니까? 그래서 내가 삭제 한 후 메모리를 다시 채우려고한다면 필요에 따라 반환하겠습니까? – lasvig