2012-12-09 5 views
1

을 삭제 :배열 -이 코드가 작전

Derived **args = new Derived*[2]; 
args[0] = new Derived(); 
args[0]->setname("BLABLA \n"); 
cout << args[0]->getname(); 
delete args[0]; 

args[1] = new Derived(); 
args[1]->setname("BLABLABLA\n"); 
cout << args[1]->getname(); 
delete args[1]; 
delete [] args; 

delete [] args가 필요하다? 그리고 왜?

또한 Derived **args = new Derived*[2]은 실제로 무엇을 수행합니까? 두 포인터에 대한 공간을 Derived에 할당합니까? 그렇다면 어떻게 동적으로 힙에 파생 된 두 개의 객체가 들어있는 배열을 만들 수 있습니까?

답변

1

delete []이 필요합니까? 그리고 왜?

예입니다. 할당 된 메모리가 new Derived*[2]에 의해 해제됩니다.

또한

, Derived **args = new Derived*[2] 정말 무엇을해야합니까?

그것은 두 포인터 Derived-위한 공간을 할당한다. 어떤 Derived개체에 대한 공간을 할당하지 않습니다.

힙에 Derived 유형의 객체 2 개가 포함 된 배열을 어떻게 동적으로 생성합니까?

그냥 간접 한 단계 제거 :

Derived *args = new Derived[2]; 

args[0].setname("BLABLA \n"); 
cout << args[0].getname(); 

args[1].setname("BLABLABLA\n"); 
cout << args[1].getname(); 

delete [] args; 

을하지만 배열과 다형성 (polymorphism)이 혼합하지 않는 명심. 자세한 내용은 How to make an array with polymorphism in C++?

+1

@SteveWellens를 참조하십시오. 즉, 포인터의 배열을 해제하지만 포인터가 가리키는 개체를 확실히 해제하지 않습니다. – Blastfurnace

+0

좋아요, 방금 내 코멘트를 삭제했습니다. –

+0

"파생 된 두 포인터의 공간을 할당합니다"는 의미는 무엇입니까? 그래서 기본적으로 방금 파생 된 유형의 객체에 대한 포인터를 보유하는 크기 2의 배열을 만들었습니까? 그렇다면 어떻게 동적으로 힙에 파생 된 두 개의 객체가 포함 된 배열을 만들 수 있습니까? – Kam