2014-12-09 2 views
0

이것이 좋은 코딩 방법인지 확실하지 않으므로 잘못 되었다면 수정하십시오.역 참조 포인터의 배열을 삭제해야합니까?

동적으로 Transaction 클래스를 만들고이 객체를 Transaction 객체의 벡터에 추가하는 방법이 필요했습니다. 이것은 내가 한 것입니다 :

class Transaction { 
    int data; 
    Transaction(int d) : data(d) {} 
}; 

class Container { 
    std::vector<Transaction> transactions; 
    void createTransaction(); 
}; 
void Container::createTransaction() { 
    int data; 
    std::cout << "Enter your data: "; 
    std::cin >> data; 
    Transaction t = new Transaction(data); 
    // In order to keep the object from destruction at end of function. 
    // Possibly could be done with static as well. 
    transactions.push_back(*t); 
} 

벡터는 포인터가 아닌 객체의 벡터입니다. 이것은 동적 메모리를 삭제할 필요가없는 경우인가요? 프로그램/스코프가 끝나면 자동으로 삭제됩니다.

개체를 동적으로 만들고 저장하는 것은 어려운 방법입니까?

+4

이 구현은 바람직하지 않을 수 있습니다. 나는't' *를 동적으로 할당 할 이유가 없다고 생각합니다. 입력 후에'transactions.emplace_back (data);'을 수행하고 나머지는 던져 버린다. – WhozCraig

답변

4

값의 의미는 적용 transactions.push_back(*t);std::vectort사본를 밀어 것입니다.

그래도 원래 개체에 할당 된 메모리를 삭제해야합니다. newdelete을 호출하여 일치해야합니다.


당신은 아마 처음에 new 필요하지 않습니다

, 당신은 다만 할 수 있습니다

Transaction t(data); 
... 
transactions.push_back(t); 

참고 :

매트에 의해 지적, Transaction t = new Transaction(data);이되지도 않습니다 컴파일했을 때, 아마도 비슷한 것을 의미했을 것입니다. Transaction* t = new Transaction(data);

+0

이것은 매우 비싸지 않거나 나쁜 관행으로 간주되지 않습니까? 스택에 객체를 놓고'tanstactions.push_back (t)'를 사용하여 객체를 복사하면됩니다. – Gio

0

일반 개체 또는 포인터 벡터에있는 객체에. 힙에 객체를 생성 한 다음 일반 객체를 벡터로 스트로 밍할 때 사이에 어딘가에 선을 그립니다.

질문은 누가 이러한 개체를 삭제할 것입니까?

기본적으로 일반 개체를 벡터에 저장합니다. 그러나 객체의 복사가 비싸거나 객체에 대한 복사를 정의하는 적절한 방법이 없거나 다형성 동작을 유지하려는 경우 포인터를 컨테이너에 저장합니다.