好吧,所以我最后一次以C++为生,std::auto_ptr所有的std lib都可用,而且boost::shared_ptr风靡一时.我从未真正研究过提供的其他智能指针类型.我知道C++ 11现在提供了一些类型的提升,但不是全部.
那么有人有一个简单的算法来确定何时使用哪个智能指针?优选地包括关于哑指针(诸如原始指针T*)和其他增强智能指针的建议.(像这样的东西会很棒).
我有一个带有unique_ptr成员的类.
class Foo {
private:
std::unique_ptr<Bar> bar;
...
};
Run Code Online (Sandbox Code Playgroud)
Bar是第三方类,具有create()函数和destroy()函数.
如果我想std::unique_ptr在独立功能中使用它,我可以这样做:
void foo() {
std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); });
...
}
Run Code Online (Sandbox Code Playgroud)
std::unique_ptr作为班级成员,有没有办法做到这一点?
根据N3290 std::unique_ptr在其构造函数中接受一个删除参数.
但是,我不能在Windows中使用Visual C++ 10.0或MinGW g ++ 4.4.1,也不能在Ubuntu中使用g ++ 4.6.1.
因此,我担心我对它的理解是不完整或错误的,我不能看到显然被忽略的删除论证的观点,那么任何人都可以提供一个有效的例子吗?
我最好还想看看它是如何工作的unique_ptr<Base> p = unique_ptr<Derived>( new Derived ).
可能会使用标准中的一些措辞来备份示例,即使用您正在使用的任何编译器,它实际上做了它应该做的事情?
我有一个问题(segfault)在C++ 11中运行多线程代码.这是代码:
#include <vector>
#include <thread>
std::vector<int> values;
int i;
void values_push_back()
{
values.push_back(i);
}
int main()
{
while(true)
{
std::vector<std::thread> threads;
for(i=0; i<10; ++i)
{
std::thread t(values_push_back);
threads.push_back(std::move(t));
}
for(i=0; i<10; ++i)
threads[i].join();
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这里是gdb上的回溯:http://pastebin.com/5b5TN70c
这有什么不对?
在我的问题有关std::thread,我建议使用std::thread::hardware_concurrency().我读到了某个地方(我找不到它,看起来像是一个本地的代码存储库),这个功能没有在4.8之前的g ++版本中实现.
事实上,我和这个用户处于同一个受害者的位置.该函数将返回0.我在此答案中找到了一个用户实现.欢迎评论这个答案是否合适!
所以我想在我的代码中执行此操作:
unsinged int cores_n;
#if g++ version < 4.8
cores_n = my_hardware_concurrency();
#else
cores_n = std::thread::hardware_concurrency();
#endif
Run Code Online (Sandbox Code Playgroud)
但是,我可以找到实现这一结果的方法.我该怎么办?