关于boost中shared_ptr的疑问

q96456 2011-11-25 07:53:38
shared_ptr被很多人说成是最好用的智能指针。今天刚刚开始学习就遇到了一个问题。shared_ptr的传参数问题。比如,对于CreateThread函数的第4个参数可以传一个lpvoid指针作为参数穿进去的,也就是任意类型的指针,但是不能够将 shared_ptr作为lpvoid传入。当然可以将shared_ptr中的指针提取出来,但是这样就导致计数并不记录比如下面的程序片段:
typedef struct InsertData
{
int iNum;
char cData[10];
InsertData()
{
iNum = 10;
ZeroMemory(cData, 10);
}
}INSERT, *PINSERT
//////////////////////////////////////////////////////////////////////
void fun()
{
INSERT* pInsertData = new INSERT;
boost::shared_ptr<INSERT> shTest(pInsertData);
char cData[5] = {'a','b','c','d'};
memcpy(pInsertData->cData, cData, 4);
m_hThread = CreateThread(NULL, 0, ThreadFunc,(LPVOID)&(*shTest), NULL, 0);
Sleep(2000);
}

DWORD ThreadFunc(LPVOID pParam)
{
boost::shared_ptr<INSERT> pThreadShared((INSERT*)pParam);
int i = 0;
for (int j = 0; j < 10; j++)
{
i++;
TRACE("第%d次输出%s\n", i, pThreadShared->cData);
Sleep(1000);
}
Sleep(5000);
return 0;
}

这个程序执行结果显示只有第一次和第二次输出结果正确,之后的就是错误指针。意味着计数没有将这个参数传递记录,fun函数结束后就已经释放了。那么我想问有什么方法可以让它记录呢。当然你可以说直接使用boost的多线程,但是在实际工程中有很多第三方提供的借口参数就是void*类型,是不是这种情况下智能指针就没有作用了呢。求教各位大侠
...全文
322 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
q96456 2011-12-20
  • 打赏
  • 举报
回复
问题已经解决了 是可以是用BOOST的智能指针同时使用CreateThread的 只需要将shared指针和它所管理的资源封装到一个结构体中 将结构体指针作为参数传给CreateThread 并在子线程函数中再定义一个shared指针 接受结构体指针中的shared 这样就可以完成。
typedef struct InsertData
{
int iNum;
char cData[10];
InsertData()
{
iNum = 10;
ZeroMemory(cData, 10);
}
~InsertData()
{
int i =0;
}
}INSERT, *PINSERT;

typedef struct SharedInsert
{
INSERT* pInsert;
typedef boost::shared_ptr<INSERT> shTest;
shTest pShared;
SharedInsert()
{
pInsert = new INSERT();
pShared = shTest(pInsert);
}

}SHAREDPTR,PSHAREDPTR;
////////////////////////////////////////////////////
void Cshared_ptrDlg::OnBnClickedButton1()
{
SHAREDPTR stru;
char cData[5] = {'a','b','c','d'};
memcpy(stru.pInsert->cData, cData, 4);
TRACE("lixin————%s\n", stru.pInsert->cData);
m_hThread = CreateThread(NULL, 0, ThreadFunc,(LPVOID)(&stru), NULL, 0);
}
//////////////////////////////////////////////////////
DWORD Cshared_ptrDlg::ThreadFunc(LPVOID pParam)
{
SHAREDPTR* pSharedTemp;
pSharedTemp = (SHAREDPTR*)pParam;
SHAREDPTR::shTest pShared = pSharedTemp->pShared;

int i = 0;
for (int j = 0; j < 10; j++)
{
i++;
TRACE("第%d次输出%s\n", i, pShared->cData );
Sleep(1000);
}
return 0;
}

疾似云流 2011-12-13
  • 打赏
  • 举报
回复
用boost的shared_ptr,自然得用boost的thread.


void thrd_func(shared_ptr<int> sp)
{
}

int test()
{
shared_ptr<int> sp(new int(10));
boost::thread thrd(boost::bind(thrd_func, sp));
thrd.join();
}
respone 2011-12-09
  • 打赏
  • 举报
回复
建议封装你的函数给别人用 你的函数里可以用boost
q96456 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 taodm 的回复:]
不要和纯C接口的操作系统api混用C++的容器、智能指针。
[/Quote]
那么也就是说在一个工程中(多人完成)如果其他人的借口都没有涉及到智能指针,我的也不能用的了。这样的通用性就有些差了。看来确实没有什么解决办法
taodm 2011-11-25
  • 打赏
  • 举报
回复
不要和纯C接口的操作系统api混用C++的容器、智能指针。
q96456 2011-11-25
  • 打赏
  • 举报
回复
我知道这样肯定不对,程序的结果已经证实了。见我只是想知道怎么样可以将这个智能指针做参数传进去并且能够正确地计数。
pengzhixi 2011-11-25
  • 打赏
  • 举报
回复
share_ptr被你这么一用完全就错了。
shared_ptr<INSERT> pThreadShared((INSERT*)pParam);
你在这里面又创建一个shared_ptr对象这使得两个shared_ptr指向同一个对象,这意味着pThreadShared的销毁导致线程外的那个里面的原生指针悬空了。

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧