Я пытался экспериментировать с правилами Five / Three / Zero. При компиляции моей программы я получил предупреждение C26401
о том, что я не должен удалять указатель, который мне не принадлежит, и это в строке delete[] pChar_;
в функции деструктора.
Я согласен, что у меня возникла проблема, особенно при вызове move ctor
, когда я применяю std::swap
при вызове исходного объекта.
Так, как я мог исправить эту проблему?
Редактировать : Как предлагается в комментарии, я могу использовать std :: string (Good), но я хочу знать, как исправить проблему, не изменяя типы, скажем, чтобы узнать, что:)
using namespace std;
struct A
{
A();
A(int Int, const char* pChar);
A(const A& rhs);
A& operator=(A rhs);
A(A&& rhs);
~A();
void swap(A& rhs);
int Int_ = 0;
char *pChar_ = nullptr;
};
A::~A()
{
std::cout << "----DTOR----" << std::endl;
if (pChar_ != nullptr)
{
delete[] pChar_;
pChar_ = nullptr;
}
}
A::A(int Int, const char* pChar) :
Int_(Int), pChar_(new char[strlen(pChar) + 1])
{
strncpy_s(pChar_, strlen(pChar) + 1, pChar, _TRUNCATE);
}
A::A(const A& rhs) : A(rhs.Int_, rhs.pChar_) {}
A& A::operator=(A rhs)
{
swap(rhs);
return *this;
}
A::A(A&& rhs)
{
swap(rhs);
}
void A::swap(A& rhs)
{
std::swap(this->Int_, rhs.Int_);
std::swap(this->pChar_, rhs.pChar_);
}
int main()
{
A v1{ 1, "Hello" };
{
A v3{ std::move(v1) };
}
}