【发布时间】:2015-08-15 04:59:03
【问题描述】:
这个例子在 gcc 4.8.3 下编译和运行良好:
#include <memory>
#include <functional>
#include <iostream>
int main() {
auto str = new const char[6]{'h', 'e', 'l', 'l', 'o', '\0'};
std::unique_ptr<const char[], std::function<void(const char *)>> u_ptr(str, [](const char *s){ delete[] s; });
std::cout << u_ptr.get() << std::endl;
}
但是当我使用 Visual Studio Professional 2013 进行尝试时,它无法编译(抱怨删除的函数)。 这在 Visual Studio 2013 中还不可能吗?还是我的示例代码错误而 gcc 忽略了我的错误?
错误是:
main.cpp(8) : 错误 C2280: 'std::unique_ptr>::unique_ptr>(_Ptr2,_Dx2)' : 试图引用已删除的函数 和 [ _Ptr2=const char * , _Dx2=main:: ] C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\INCLUDE\memory(16 16) : 参见 'std::unique_ptr>::unique_ptr' 的声明
【问题讨论】:
-
应该有一个常见问题解答“为什么使用
std::function作为unique_ptr删除器是一个糟糕的主意?” -
不应该
T是char而不是char const[]?这适用于 Visual C++ 2015 RC。 -
std::unique_ptralready supportsdelete[]没有理由在这里写你自己的。 -
@T.C.:您能否详细说明或提供一些链接说明为什么这是一个坏主意?
-
@rodrigo 例外。
unique_ptr要求与其删除器关联的所有操作不得抛出;std::function的构造函数可以抛出,因为它使用类型擦除并且可能需要在后台分配内存。 (在 OP 的代码中情况更糟,因为std::function将在调用unique_ptr的构造函数之前构造,如果抛出,则无论unique_ptr需要什么,指针都会泄漏。)
标签: c++ visual-c++ unique-ptr