개체 조각이없는 벡터에 파생 클래스를 저장하려고합니다. 나는 을 하루의 대부분을 열심히보고 있었고 그것이 작동하게 만드는 방법을 알아 내지 못했습니다. 내가 파생 된 객체에 대한 포인터를 저장하는 것이 좋습니다. 실제로 실제 객체를 저장하는 것이 좋습니다. 나는 그것을 작동시키지 못했지만,이 객체들을 에 추가하여 벡터가 범위를 벗어나는 전에 객체가 범위를 벗어날 수 있도록합니다. 그래서, 그런 해결책은 어쨌든 일할 것이라고 생각하지 않습니다. 또 다른 해결책은 기본 클래스를 추상화하는 것이지만 중 하나는 작동하지 않는다는 것을 의미합니다. 나는 대입 연산자와 복사를 무시하는 것에 대해 읽었지 만, 그들은 보통의 할당 연산자와 noraml 복사 생성자와 다른 것을 끝내지는 않았다고 생각하지 않는다. 나는 가상의 할당 연산자를 사용해도 성공하지 못했습니다. 아래는 제가 작업 한 예입니다. . "vec.emplace_back (& derivedEvent);" 기본 메서드 의 문을 사용하면 벡터에 기본 클래스가 추가됩니다. 그 직후에 객체는 범위를 벗어나 파생 된 Event의 데이터를 더 이상 포함하지 않습니다. 나는 시도한 무엇이든이 부정확하게 행해질지도 모르는 아직도 프로그램에 아주 새롭다.개체 조각화, 범위를 벗어난 벡터 요소
#include <string>
#include <vector>
////////////////////////////////////////////////////////////////////////////////
class CBaseEvent {
protected:
CBaseEvent(){}
std::string m_strBeginning;
std::string m_strEnd;
public:
CBaseEvent(std::string strBeginning, std::string strEnd)
: m_strBeginning(strBeginning), m_strEnd(strEnd){}
};
////////////////////////////////////////////////////////////////////////////////
class CDerivedEvent : public CBaseEvent {
private:
CDerivedEvent(){}
std::string m_strMiddle;
public:
CDerivedEvent(
std::string strBeginning,
std::string strMiddle,
std::string strEnd)
: CBaseEvent(strBeginning, strEnd),
m_strMiddle(strMiddle){}
};
////////////////////////////////////////////////////////////////////////////////
int main() {
std::vector<std::shared_ptr<CBaseEvent>> vec;
if (true) {
CDerivedEvent derivedEvent = CDerivedEvent("1", "2", "3");
vec.emplace_back(&derivedEvent);
}
return 0; //CRASH: possible corruption of the heap
}
는'나는 벡터가 이해가되지 않습니다 scope'의 외출하기 전에 개체가 범위의 외출 발생합니다 같은 방법으로 벡터에 이러한 개체를 추가 할. 벡터에서 요소를 지우려면'std :: vector :: erase'를 사용하십시오. –