2010-07-07 2 views
2

I는 다음과 같이 생성 된 배열이있는 경우 :C++ : 새로운 생성 된 배열의 요소에 덮어 쓰기

MyType *array = new MyType[10]; 

을 그리고, 요소 중 하나를 덮어 쓰려면 내가 좋아하는 delete 먼저 이전 요소해야합니까 이 :

delete &array[5]; 
array[5] = *(new MyType()); 

아니면 완전히 잘못 되었나요? "포인터를 가리키는 포인터"와 같은 작업을해야합니까? 그렇다면, ...

감사

답변

11

그것은하지 포인터의 의 배열, 제발 방법에 대해 설명합니다. 그래서 당신은 할 것입니다

array[5] = MyType(); 

이것은 할당 연산자를 지원하려면 MyType이 필요합니다.


덧붙여 말하자면 C++에서는 수동 배열 할당이 거의 필요하지 않습니다. 거리 newdelete와는 대신 std::vector를 사용

std::vector<MyType> array(10); 
array[5] = MyType(); 

주, 아무것도 삭제할 필요가 없습니다.

+2

+1 표준 : : vector. 충분히 그럴 수 없어 :) – rubenvb

3

어레이의 개별 요소 new'd되지 않은 자체는 배열이다.

array[5] = MyType(); // note no `new` here. 
+0

+1 : 고마워. 이것은 내가 생각한 것입니다. –

0

소멸자를 현재 위치에서 호출 한 다음 새로운 위치 지정을 사용할 수 있습니다.

+5

예, 가능합니다. 그것은 고급 기술이지만, 질문이 꽤 기초적이라면, 그가해야 할 일은 아닐 것입니다. – Thomas

+0

@ 토마스 : 네,하지만이 솔루션은 좋은 대입 연산자가 필요하지 않습니다. – sharptooth

+0

@ 토마스 : 하하! 네 확실합니다. 질문은 꽤 기초적입니다. 그러나 저는'새로운 T [...]'와 간단한'새로운' –

2

MyTypes의 배열을 이 아니라이 아닌 포인터를 MyTypes으로 선언하고 있습니다. 배열의 요소가 new이 아니므로 delete도 아닙니다. 대신, 그냥 할 : 당신은 또한 std::vector<MyType>을 사용할 수 있습니다

array[5] = MyType(); 

참고 C++ 배열의 불편에 대한 걱정없이 힙에 MyTypes을 넣어.

std::vector<MyType> myTypes(10); 
myTypes[5] = MyType();