【问题标题】:passing a shared_ptr to this to an object owning a reference将 shared_ptr 传递给 this 到拥有引用的对象
【发布时间】:2023-04-09 00:02:01
【问题描述】:

SharedEditor 类拥有对NetworkServer 类对象的引用,而NetworkServer 对象拥有std::vector<std::shared_ptr<SharedEditor>>editors。在SharedEditor 构造函数中,调用server.connect() 方法来保存其引用,而在server.connect() 中,指向该编辑器的共享指针被保存到server 中。 程序编译并执行,但严重终止。

NetworkServer.h

#include <queue>
#include <memory>
#include "SharedEditor.h"
#include "Message.h"

class NetworkServer {
private:
    std::vector<std::shared_ptr<SharedEditor>> editors;
    std::deque<Message> messages;

public:
    int connect(std::shared_ptr<SharedEditor> sharedEditor);
};

NetworkServer.cpp

#include <algorithm>
#include "NetworkServer.h"

static int id = 0;

int NetworkServer::connect(std::shared_ptr<SharedEditor> sharedEditor) {
    editors.push_back(sharedEditor);
    return id++;
}

SharedEditor.h

#include <vector>
#include <map>
#include "Symbol.h"

class NetworkServer;

class SharedEditor {
private:
    NetworkServer& _server;

public:

    SharedEditor(NetworkServer &server);

};

SharedEditor.cpp

#include <exception>
#include <algorithm>
#include <random>
#include <iostream>
#include "SharedEditor.h"
#include "NetworkServer.h"

SharedEditor::SharedEditor(NetworkServer &server)
        : _server(server), _counter(0), base(32), boundary(10) {
    _siteId = server.connect(std::shared_ptr<SharedEditor>(this));
}

main.cpp

#include <iostream>
#include "NetworkServer.h"

int main() {
    NetworkServer network;
    SharedEditor ed1(network);
    SharedEditor ed2(network);


    return 0;
}

返回-1073740940 (0xC0000374)

【问题讨论】:

    标签: c++ reference shared-ptr circular-dependency


    【解决方案1】:

    您误解了智能指针的工作原理。

    server.connect(std::shared_ptr<SharedEditor>(this))
    

    您将指针this 传递给在堆栈上分配的对象。您必须只传递指向内存堆上动态分配对象的指针。

    您应该执行以下操作,但您的类设计不佳,因为从语义上看不清楚network 将拥有新分配的对象。

    SharedEditor* ed1 = new SharedEditor(network);
    

    【讨论】:

    • "但是这段代码设计得很糟糕,因为从语义上并不清楚网络将拥有新分配的对象。"你能澄清这一点吗?你指的是我的代码设计吗?
    • 此堆栈交换站点用于解决技术问题。要讨论您的设计,请将您的问题发布到codereview.stackexchange.com
    • *您必须只传递指向内存堆上动态分配的对象的指针。" 不仅如此。您只能使用指向对象的指针构造 shared_ptrs shared_ptr 将拥有。这意味着您不能将指针传递给其他 shared_ptrunique_ptr 已经拥有的东西,即使它是在堆上分配的。
    • 除了network,谁拥有指向SharedEditor对象的共享指针?
    猜你喜欢
    • 1970-01-01
    • 2017-03-22
    • 2021-12-07
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多