【发布时间】:2011-04-23 19:21:52
【问题描述】:
我正在尝试在map 中使用C++0x unique_ptr class,如下所示:
// compile with `g++ main.cpp -std=gnu++0x`
#include <string.h>
#include <map>
#include <memory>
using namespace std;
struct Foo {
char *str;
Foo(char const *str_): str(strdup(str_)) {}
};
int main(void) {
typedef std::map<int, unique_ptr<Foo>> Bar;
Bar bar;
auto a = bar.insert(Bar::value_type(1, new Foo("one")));
return 0;
}
但是 GCC 给了我以下错误(缩短,我认为这是相关部分,请在您自己的 C++ 编译器上测试):
main.cpp:19:从这里实例化 /usr/include/c++/4.4/bits/unique_ptr.h:214: 错误: 删除函数‘std::unique_ptr::unique_ptr(const std::unique_ptr&) [with _Tp = Foo, _Tp_Deleter = std::default_delete]’ /usr/include/c++/4.4/bits/stl_pair.h:68:错误:在这里使用我真的不确定我做错了什么,这适用于 MSVC。我发现了很多 similar 的问题,看起来很相似,但是他们的解决方案对我不起作用。
matt@stanley:/media/data/src/c++0x-test$ gcc --version gcc-4.4.real (Ubuntu 4.4.3-4ubuntu5) 4.4.3【问题讨论】:
-
不是答案,但 Foo 应该有一个释放 str 的析构函数,因为 strdup mallocs 内存并将 str_ 复制到该内存中。
-
不管什么时候正式发布都是C++0x。正如 Stroustrup 所说,将 x 视为十六进制 :)
-
@Armen:谢谢你的快乐想法:D
-
@Loy Franco:是的,我知道,这将是下一个实施,但我从来没有做到这一点(这是我遇到的一个更大问题的简化摘录)。
-
您应该添加一个析构函数 Foo::~Foo 来释放内存并明确禁用任何复制。
标签: c++ gcc c++11 stl unique-ptr