gpt4 book ai didi

C++ shared_ptr继承内存泄漏

转载 作者:行者123 更新时间:2023-11-30 04:33:37 25 4
gpt4 key购买 nike

我有一种情况,我有一个指向子类基础的 shared_ptr。

当 shared_ptr 去删除指针时,只有父析构函数被调用。

parents destructor 是 virtual,childs 不是,尽管我已经尝试过所有组合。

我在 valgrind 中有这个程序,它表明在创建对象时在 new 语句处创建了内存。我知道正在调用父析构函数,但没有调用子析构函数。

这是 child :

class NetworkUserAgent : public bbs::UserAgent
{
friend class Server;

public:
NetworkUserAgent(boost::asio::io_service &ioService, size_t _szBuffer=512u);
~NetworkUserAgent();

void asyncRead();
void doneRead(std::shared_ptr< std::vector<char> > pBuf,
const boost::system::error_code &error, size_t byTrans);

void writeTo(const std::string &msg);
void doneWrite(const boost::system::error_code &error, size_t byTrans);

void close();

private:
boost::asio::ip::tcp::socket socket_;
const size_t szBuffer;
};

父级:

class UserAgent
{
public:
//'structors
UserAgent();
virtual ~UserAgent();

//commication
virtual void writeTo(const std::string &msg)=0;
std::function<void(std::string&)> dataRead;

//user management
void login(AccessLevel _accessLevel, int userId, const std::string &_userName);
void logout();

//Accessors
AccessLevel UserAccessLevel() const;
const std::string &UserName() const;
const int &UserId() const;
bool LoggedIn() const;

//shared to allow reference to child type
std::shared_ptr<ContextAgentData> contextAgentData;
private:
std::string userName;
int userId;

AccessLevel accessLevel;
};

用法:

void Server::reset()
{
shared_ptr<NetworkUserAgent> client (new NetworkUserAgent(ioService));
acceptor_.async_accept(client->socket_,
[=] (const boost::system::error_code &error)
{ this->clientAccepted(client, error); }
);
}

void Server::clientAccepted(shared_ptr<NetworkUserAgent> client,
const boost::system::error_code &error)
{
if(error) return;
cout << "[] New client has connected" << endl;

//Generalise to Network useragent
shared_ptr<UserAgent> uaClientPtr=client;
context->receiveUserAgent(uaClientPtr);
client->asyncRead();
reset();
}

The rest of the code can be seen here .

谢谢。

另请注意,上面的代码仍在进行中。

编辑:调用子析构函数我错了,

NetworkUserAgent::~NetworkUserAgent()
{
this->close();
}

void NetworkUserAgent::close()
{
if(!socket_.is_open()) return; //socket is already closed
//one or more of these functions are probably redundant
cout << "send request" <<endl;
socket_.shutdown(ip::tcp::socket::shutdown_send);
cout << "cancel" <<endl;
socket_.cancel();
cout <<"close"<<endl;
socket_.close();
cout << "done" <<endl;
}

编辑:我做了更多的测试,恐怕问题比我希望的要复杂。然而,当项目被销毁时,析构函数被调用,问题是一旦 UserAgent 进入系统,它就不会被销毁。某些东西正在停止被破坏。

如果 shared_ptr 的几个容器对用户代理有影响和区别,当一个容器被销毁时,是否调用内部元素的析构函数?

请让我知道我还能提供什么来解决这个问题。

最佳答案

在 UserAgent 中有一个 dataRead std::function,它最终被设置为一个包含 std::shared_ptr 的 lambda,以阻止它自毁。我添加了一个 close() 方法并将 std::function 设置为其默认值。

现在一切都很好,删除也很好

谢谢你的帮助

关于C++ shared_ptr继承内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6683999/

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