我有一个包含数据向量的单例类。我的问题是我想使用标准的push_back()方法向该向量添加数据。我有一个对象我想保存在该向量中,但它是一个本地对象(在另一个类的方法中创建)。显然,在这个方法结束时,局部变量将被删除,这很好,因为我对该向量执行了该数据的push_back()。
现在,只要该方法没有结束,这就可以正常工作。结束后,数据消失了。这看起来很奇怪,因为push_back()应该使用复制构造函数吗?现在,我尝试通过引用,值,作为指针和C ++ 11中的移动构造函数将局部变量添加到向量中,但所有这些似乎都不起作用。
所以这是问题类的设置:
因此,简而言之,我希望在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是一个本地创建的变量,但它是作为指针创建的。
答案 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
//...
}
现在是pPlayerData
,shared_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 - 可以稍后从共享和改进的侵入开始。