나는 이것을 수행하는 방법에 대해 약간 혼란 스럽다. 예를 들어 메모리를 할당하는 클래스가 있다고 가정 해보십시오. 나는 자동차처럼 자기 파괴를 원하지만, 알 수없는 어떤 이유 때문에 그것을 벡터에 넣는다. 내 소멸자가 카운터 1에서 두 번 모두 호출되는이 경우 C++ 기초, 벡터, 소멸자
#include <iostream>
#include <vector>
class Test {
public:
Test();
Test(int a);
virtual ~Test();
int counter;
Test * otherTest;
};
volatile int count = 0;
Test::Test(int a) {
count++;
counter = count;
std::cout << counter << "Got constructed!\n";
otherTest = new Test();
otherTest->counter = 999;
}
Test::Test() {
count++;
counter = count;
std::cout << counter << "Alloced got constructed!\n";
otherTest = NULL;
}
Test::~Test() {
if(otherTest != 0){
std::cout << otherTest->counter << " 1Got destructed" << counter << "\n";
otherTest->counter = 888;
std::cout << otherTest->counter << " 2Got destructed" << counter << "\n";
}
}
int vectorTest(){
Test a(5);
std::vector<Test> vecTest;
vecTest.push_back(a);
return 1;
}
int main(){
std::cout << "HELLO WORLD\n";
vectorTest();
std::cout << "Prog finished\n";
}
는 ALLOC '개체가 이미 888로 설정 (또는 삭제 된 개체에 잘못된 접근으로 이어지는 해방 된 진정한 경우)하고있다. 지역 변수를 벡터에 넣는 올바른 경우는 현명하게 발생하지 않는 일종의 디자인입니다. 다음은 다르게 동작하며 소멸자는 한 번만 호출됩니다.
int vectorTest(){
//Test a(5);
std::vector<Test> vecTest;
vecTest.push_back(*(new Test(5)));
return 1;
}
어떻게 로컬 변수가 소멸자를 한 번만 호출하면 동일한 동작을하도록 할 수 있습니까? 지역을 단순히 벡터에 넣지 않겠습니까? 그러나 벡터가 배열보다 선호되지 않는다면, 로컬 객체의로드가 있다면 별도로 초기화하고 벡터에 배치하여 프리/힙 메모리를 사용하지 않고 다른 함수에 전달할 수 있습니까? 나는 여기서 중요한 무엇인가 놓치고 있다고 생각한다. 이것은 소유권을 이전하는 일종의 스마트 포인터의 경우입니까?
@ 감사합니다. 편집 해 주셔서 감사합니다. – karlphillip
나중에 코드를 선택하고 코드 아이콘 '101010'을 클릭하여 자신의 코드를 포맷 할 수 있습니다. –