짧은 답변에서 제안 할 수 있습니다 - 그것을하지 않습니다.
세부 사항 :
// copy constructor
FeatureValue::FeatureValue(const FeatureValue& other)
{
m_size = other.m_size;
delete[] m_value; // m_value NOT INITIALISED - DON'T DELETE HERE!
m_value = new uint8_t[m_size];
for (int i = 0; i < m_size; i++)
{
m_value[i] = other.m_value[i];
}
}
// assignment operator function
FeatureValue& FeatureValue::operator=(const FeatureValue& other)
{
FeatureValue(other); // error C2082: redefinition of formal parameter
return *this;
}
주 :
복사 생성자가 호출
- ,이 복사되는 객체를 참조하여 새 개체를 구성,하지만 기본 생성자는 이전에 실행되지 않습니다 복사 생성자. 즉, 복사 생성자가 실행을 시작할 때
m_value
에 불확정 값이 있음을 의미합니다. 할당 할 수는 있지만 정의되지 않은 동작이며 정의되지 않은 동작입니다. delete[]
(UD!가 악화 될 수 있습니다. ;-)). 그래서, 그냥 delete[]
라인을 빠뜨리십시오. operator=
시도가 복사 생성자에서 기능을 활용하는 경우
다음, 먼저 m_value
가 가리키는 기존 데이터를 공개해야하거나 유출됩니다. 대부분의 사람들은 다음과 같이 (을을 파괴하는) 그렇게하려고 -이 당신을 위해 노력했는지 생각 :
FeatureValue& FeatureValue::operator=(const FeatureValue& other)
{
// WARNING - this code's not exception safe...!
~FeatureValue(); // call own destructor
new (this) FeatureValue(other); // reconstruct object
return *this;
}
이것에 문제가 있음을 FeatureValue의 생성이 실패 할 경우 (예 : new
할 수 있기 때문에 메모리를 얻지 못하면 FeatureValue
객체는 유효하지 않은 상태로 남습니다 (예 : m_value
이 공간을 가리킬 수 있음). 나중에 소멸자가 실행되고 delete[] m_value
을 수행하면 정의되지 않은 동작이 발생합니다 (프로그램이 중단 될 수 있음).
정말 체계적으로 접근해야합니다 ...그것을 간단하고 깨끗
FeatureValue& FeatureValue::operator=(FeatureValue other)
{
swap(other);
return *this;
}
:하지만, 중 단계적으로 그것을 밖으로 쓰기, 혹은 ... 할 (쉬운 단지 std::swap()
m_size
및 m_value
을 보장 비 던지는 swap()
방법을 구현하고, 람를 사용하여 몇 가지 사소한 성능/효율성 문제가 있습니다. 피크 메모리 사용량 증가, 주변에 필요 이상으로 기존 m_value
배열을 유지
을 ... 당신은 clear()
를 부를 수 실제로, 대부분의 비 사소한 프로그램은 신경 쓰지 것 이것에 관해서는 dat 해당 구조에서 방대한 양의 데이터 (예 : PC 앱의 경우 수백 메가 바이트 또는 기가 바이트).
메모리를 다시 사용하려고하지 않아도됩니다. 대신 other
에 대해 다른 new
(항상 메모리 사용량을 줄일 수 있지만 항상 가치있는 것은 아닙니다)을 수행해야합니다.
는 궁극적 이유는 별개의 복사 생성자와 operator=
있을 수 있습니다 - 오히려 컴파일러는 자동으로 다른 하나를 만들 필요없이 - 일반적으로 - - 길에서 서로를 활용하여 최적의 효율적인 구현을 할 수 없다는 것입니다 너는 바랐다.
을 주셔서 감사합니다. 'value [i] = other.m_value [i]'? – stackunderflow