将本地对象复制到矢量

时间:2014-08-23 16:02:59

标签: c++ c++11 vector

我有一个包含数据向量的单例类。我的问题是我想使用标准的push_back()方法向该向量添加数据。我有一个对象我想保存在该向量中,但它是一个本地对象(在另一个类的方法中创建)。显然,在这个方法结束时,局部变量将被删除,这很好,因为我对该向量执行了该数据的push_back()。

现在,只要该方法没有结束,这就可以正常工作。结束后,数据消失了。这看起来很奇怪,因为push_back()应该使用复制构造函数吗?现在,我尝试通过引用,值,作为指针和C ++ 11中的移动构造函数将局部变量添加到向量中,但所有这些似乎都不起作用。

所以这是问题类的设置:

  • ConnectionManager(保存向量)
  • ClassA(具有使用本地typeX对象的方法)

因此,简而言之,我希望在ClassA中的方法中创建的对象在该方法之后可用,但是在ConnectionManager类的向量中。

编辑:这是我正在谈论的typeX:

struct Connection
{
    SOCKET socket;
    PlayerData* pPlayerData;
};

套接字只是普通的winsock SOCKET变量,而PlayerData *是使用Google的ProtocolBuffer创建的自定义对象。

进一步编辑:

这是我创建数据的方式:

Predefined::Connection connTemp;
connTemp.socket = 0;
connTemp.pPlayerData = data;
MultiplayerData::GetInstance()->AddPlayerToGame(connTemp);

connTemp.pPlayerData是一个本地创建的变量,但它是作为指针创建的。

2 个答案:

答案 0 :(得分:2)

如果问题是您正在创建PlayerData数据,并希望在函数退出后仍然可以使用相同的数据,则看起来应该使用{{1而不是裸std::shared_ptr<PlayerData>

PlayerData*

由于#include <vector> #include <memory> //.. class PlayerData { int x, y, z; public: PlayerData(int a1, int a2, int a3) : x(a1), y(a2), z(a3) {} }; typedef std::shared_ptr<PlayerData> PlayerDataPtr; struct Connection { SOCKET socket; PlayerDataPtr pPlayerData; }; typedef std::vector<Connection> ConnectionVector; void foo() { auto data = std::make_shared<PlayerData>(1, 2, 3); // create data dynamically //... Connection connTemp; connTemp.socket = 0; connTemp.pPlayerData = data; MultiplayerData::GetInstance()->AddPlayerToGame(connTemp); // this does the push_back //... } 现在是pPlayerDatashared_ptr生成的那些副本只会提高引用计数,相反,当这些副本被销毁时,引用计数会递减。当引用计数达到0时,确实将删除vector

如果您未在共享指针上调用data,这或多或少会保证您在reset完成之前创建的data将会存在,只要矢量中的条目没有被删除。

此外,我编辑了示例以显示更简单的push_back类。请注意PlayerData的使用方式。

答案 1 :(得分:1)

结构连接确实会被复制到向量中,因此您无需担心其生命周期的结束。然而,pPlayerData需要指向一个用new分配的内存并由某人拥有。

connTemp.pPlayerData = data;

'数据'来自哪里 - 在本地生成? “数据”需要在某个时候由“新”分配。

如果“data”都是唯一的,请考虑使用auto_ptr或unique_ptr作为pPlayerData成员的类型--C ++不会自动管理标准指针。如果它们不是唯一的,那么使用shared_ptr或intrusive_ptr - 可以稍后从共享和改进的侵入开始。