【发布时间】:2018-11-02 18:13:05
【问题描述】:
我试图尝试五/三/零的规则。在编译我的程序时,我收到了一个警告 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) };
}
}
【问题讨论】:
-
用
std::string替换你的char*,你可以回到零规则。 -
@CoryKramer :是的,这是我想用的,但我想知道是否有办法在不使用 std::string 的情况下解决这个问题,只是为了了解如何解决这种情况。
-
我没有看到代码有问题。 FWIW
if (pChar_ != nullptr)检查是不需要的,因为nullptr上的delete是非操作 -
我依稀记得GSL中的一些
owner<Ptr>标签。 -
@chris :很好,我在指南中读到了这一点,但显示的示例类似于 owner
用于返回指针的函数,但这不是我的情况,你能解释一下我该如何使用这个主人!?!
标签: c++ move-semantics