gpt4 book ai didi

c++ - vector::push_back 在没有复制构造函数的对象上——指针值丢失了吗?

转载 作者:太空狗 更新时间:2023-10-29 21:24:44 26 4
gpt4 key购买 nike

我有一个类 Agent,其成员属性指针指向另一个类 Form 的对象:

代理.h

...//snip includes
class Agent{
private:
Form* mvForm_ptr;
...
public:
Agent();
~Agent();
...//snip additional functionality, but no copy-constructor
};

代理.cpp

#include "Agent.h"
Agent::Agent(){
mvForm_ptr = new Form();
}
Agent::~Agent(){
delete mvForm_ptr;
}
...

如您所见,我没有 Agent 的显式复制构造函数。后来我使用Agent如下:

Agent player;
std::vector<Agent> agentsVector;
agentsVector.push_back(player);

这似乎是 SIGSEGV 崩溃的原因,其错误报告声称 ~Agent 正在抛出 EXC_BAD_ACCESS 异常。阅读 vector::push_back here似乎 push_back 试图复制传入的值。由于我在 Agent 类中没有复制构造函数,在隐式复制尝试时 Form 指针会发生什么情况?如果指向的值在编译器生成的隐式复制构造函数中丢失,添加显式复制构造函数是否会解决错误的访问异常?上述代理类的复制构造函数应该如何实现?这是Rule of Three描述的前提的例子吗? ?

最佳答案

what happens to the Form pointer upon an implicit copy attempt?

发生的是指针数据成员被复制,这意味着原始数据成员和拷贝都指向同一个对象,这反过来意味着它们都将在生命周期结束时尝试删除它。这些删除中只有一个可以成功。另一个导致未定义的行为

在 C++11 中,您可以通过按住 std::unique_ptr<Form> 来解决这个问题。而不是原始指针。在 C++03 中,遵循 rule of three .

关于c++ - vector::push_back 在没有复制构造函数的对象上——指针值丢失了吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15349248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com