2014-11-06 1 views
1

새로운 배열에 관한 간단한 질문이 있습니다. 이 코드 나 포인터의 벡터에 새로운 배열 부재의 주소를 밀어했지만, I는 I 아래 주석 코드 사용할 경우 케이스 벡터 반복기이 포인터의 기능을 호출 할 수 없습니다 :"new"배열 멤버의 주소를 벡터에 전달하는 방법

#include <iostream> 
#include <vector> 
#include <fstream> 

std::ofstream trace("test.out") ; 

class Counted { 
    int id ; 
    static int count ; 
public: 
    Counted():id(count++) {trace << "Counted Object Constructed, ID = " 
        <<id << std::endl;} 
    ~Counted(){trace<< "Counted Object destroyed..." << std::endl;} 
    int get_id()const {return id;} 

}; 


int Counted::count = 0; 

int main() { 
    std::vector<Counted*> Counted_vector; 
    std::vector<Counted*>:: iterator counted_it ; 
    const int buff_size = 5 ; 
    //Counted *c = new Counted[buff_size] ; 

    /*for(int i = 0; i < buff_size; i++){ 
    Counted_vector.push_back(&c[i]) ; // not useful 
    }*/ 

    for(int i = 0; i < buff_size; i++){ 
    Counted_vector.push_back(new Counted) ; 
    } 

    counted_it = Counted_vector.begin(); 
    while (counted_it <= Counted_vector.end()){ 
    if(*counted_it){ 
    trace << "*(counted_it)->get_id() = " << (*counted_it)->get_id() 
      <<std::endl ; 
    delete *counted_it ;} 
    else break; 
     counted_it++; 
    } 

} 

출력 :

Counted Object Constructed, ID = 0 
Counted Object Constructed, ID = 1 
Counted Object Constructed, ID = 2 
Counted Object Constructed, ID = 3 
Counted Object Constructed, ID = 4 
*(counted_it)->get_id() = 0 
Counted Object destroyed... 
*(counted_it)->get_id() = 1 
Counted Object destroyed... 
*(counted_it)->get_id() = 2 
Counted Object destroyed... 
*(counted_it)->get_id() = 3 
Counted Object destroyed... 
*(counted_it)->get_id() = 4 
Counted Object destroyed... 

주석 코드가 사용 된 경우 :

Counted Object Constructed, ID = 0 
Counted Object Constructed, ID = 1 
Counted Object Constructed, ID = 2 
Counted Object Constructed, ID = 3 
Counted Object Constructed, ID = 4 
*(counted_it)->get_id() = 0 
Counted Object destroyed... 
+0

배열의 단일 요소에 대해 'delete'를 호출 할 수 없습니다. 한 번에 전체 배열을'[]'삭제해야합니다. (일반적으로'new/new []'에 대한 각각의 호출은'delete/delete []'에 대한 하나의 호출에 의해 반드시 일치해야하고, 스마트 포인터/벡터/어떤 RAII 메커니즘을 사용해서 이것을 보장해야합니다) – Nemo

+0

['' std :: vector :: assign()'] (http://en.cppreference.com/w/cpp/container/vector/assign)을 호출하여'std :: vector <>'를 초기화합니다. 또한 스마트 포인터를 실제로 찾고있는 것 같습니다. ['std :: shared_ptr'] (http://en.cppreference.com/w/cpp/memory/shared_ptr) :'std :: vector >'' –

답변

1

이 작업을 수행해서는 안 :

,
delete *counted_it ; 

메모리가 Counted *c = new Counted[buff_size] ;에 의해 할당 된 경우 메모리를 할당 해제하는 올바른 방법은 delete[] c;이어야하며, 요소를 별도로 삭제할 수 없습니다.

관련 문제