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