2013-09-22 6 views
2

My C++ 클래스에는 std :: vector 및 std :: array 인스턴스 변수를 삭제하려고하는 소멸자가 있습니다.std :: vector & std :: array를 삭제할 수 없습니까?

#include <iostream> 
#include <vector> 
#include <array> 

int main() 
{ 
    std::array<int, 3> foo; 
    std::vector< std::array<float, 4> > vertices; 

    foo[0] = 1; 
    foo[1] = 2; 
    foo[2] = 3; 
    std::cout << foo[0] << std::endl; 
    delete foo; 
    delete vertices; 

    return 0; 
} 

메모리를 적절하게 확보하는 방법을 잘 모르겠습니다. 어떻게 이러한 변수를 삭제할 수 없습니까?

clang++ -std=c++11 -stdlib=libc++ -Weverything ccc.cpp 
ccc.cpp:14:2: error: cannot delete expression of type 'std::array<int, 3>' 
     delete foo; 
     ^ ~~~ 
ccc.cpp:15:2: error: cannot delete expression of type 'std::vector<std::array<float, 4> 
     >' 
     delete vertices; 
     ^ ~~~~~~~~ 
ccc.cpp:18:2: warning: C++98 requires newline at end of file [-Wc++98-compat-pedantic] 
} 
^ 
+7

당신은'new'로 아무 것도 할당하지 않았습니다, 왜'delete'로 어떤 것을 할당 해제하겠습니까? 이들은 자동 변수입니다. 범위를 벗어나면 자동으로 삭제됩니다. –

+0

클래스의 구성원 인스턴스 변수 인 경우에도 마찬가지입니까? – ejang

+0

예, 클래스 멤버에게는 숨겨진 새 항목이 없습니다. – chris

답변

8

이 변수를 삭제 하시겠습니까? 유일한 "변수"는 delete이고 할당 한 것은 new입니다. 이 코드에 new로 무엇을 할당 했습니까? 아니, 그럼 delete에 들르지 마라.

개체 foovertices 저장 기간의 로컬 개체입니다. 이러한 개체의 메모리는 자동으로 할당되고 자동으로 해제됩니다. 너 스스로 할 수 없어. 이것은 완전히 사용자의 통제 범위를 벗어납니다.

메모리 할당을 수동으로 제어하려면 new을 사용하여 이러한 개체를 동적으로 만들어야합니다. 예 :

std::array<int, 3> *foo = new std::array<int, 3>(); 
... 
(*foo)[0] = 1; 
(*foo)[1] = 2; 
(*foo)[2] = 3; 
... 
delete foo; 

위의 내용이 적용됩니다. 그러나 동적 메모리를 포함시킬 실제 이유는 없습니다. 자동 개체와 마찬가지로 완벽하게 작동합니다. 그냥 delete에 그만 노력하십시오.

delete포인터을 인수로 예상합니다. new을 통해 객체를 할당하면 포인터를 통해 이러한 객체에 액세스하게됩니다. 이러한 포인터는 나중에 이러한 개체를 삭제하기 위해 delete에 전달합니다. 이 코드에는 아무 것도 해당되지 않습니다.

+0

std :: array의 내용이 객체 포인터 인 경우 어떻게됩니까? "std :: array myArray1;"과 유사합니다. "Object * myArray2 [10];"인 경우 "delete [] myArray2;"를 호출 할 수 있으며 Object 인스턴스의 소멸자도 호출합니다. . "delete [] myArray1;"이라고 부를 수 있습니까? ? – phoad

+0

@phoad : 귀하의 의견을 이해할 수 있는지 잘 모르겠습니다. myArray2가'Object * myArray2 [10]'으로 선언 되었다면 ** delete [] myArray2'를 할 수 없을 것입니다. – AnT

+0

나는 "delete [] arr;"로 기억하고있다. "arr"에있는 각 객체의 소멸자를 호출하고 할당을 해제합니다. http://www.cplusplus.com/reference/new/operator%20delete[]/ "operator delete []는 다른 함수처럼 명시 적으로 호출 할 수있는 일반 함수이지만 C++에서는 delete []가 연산자입니다 매우 구체적인 동작 : delete [] 연산자를 사용하는 표현식은 먼저 배열의 각 요소에 대해 적절한 소멸자를 호출 한 다음 (클래스 유형 인 경우) 배열 할당 해제 함수를 호출합니다. " Object * arr [] 대신 Object arr [] = new Object [10] 여야합니까? – phoad