C++11 替代提升::checked_delete
C++11 alternative to boost::checked_delete
作为前向声明的重度用户,我喜欢我的类在销毁时完成。为了确保这一点,我将析构函数设为私有并boost::checked_delete
成为朋友:
#include <boost/checked_delete.hpp>
struct MyClass
{
//MyClass's interface
private:
~MyClass() { /* something */ }
friend void boost::checked_delete<>(MyClass* x);
};
在C++11中,std::default_delete
还检查销毁时的完整性。但是,我无法实现与上述相同的行为:
#include <memory>
struct MyClass
{
//MyClass's interface
private:
~MyClass() { /* something */ }
friend struct std::default_delete<MyClass>;
};
int main()
{
//const std::shared_ptr<MyClass> d {
// std::make_shared<MyClass>()
//}; //(1) Should compile?
const std::shared_ptr<MyClass> d(
new MyClass,std::default_delete<MyClass>()
); //(2) Does compile
}
我想知道
- 如何编译标记为 (1) 的行?使用
std::make_shared
是一件好事 - 标有 (2) 的行真的有效吗?显式指定删除器感觉很糟糕
我正在使用GCC 4.8.0,并且我检查了-std=c ++ 11和-std=c ++ 1y标志。
这样的事情应该可以工作:
struct wrapper;
struct MyClass
{
private:
~MyClass() { /* something */ }
friend wrapper;
};
struct wrapper
{
MyClass obj;
};
// ...
auto const tmp = std::make_shared<wrapper>();
std::shared_ptr<MyClass> p(tmp, &tmp->obj);
不要将make_shared
调用放在初始值设定项列表中,只需进行正常初始化:
const std::shared_ptr<MyClass> d = std::make_shared<MyClass>();
至于第二件事,如果您不指定删除器,那么它将是默认的删除器。
相关文章:
- 运算符C++ "delete []"仅删除 2 个前值
- g++用户定义的动态链接库上的全局new和delete运算符
- 为什么"delete"关键字不删除节点?
- "delete"在 C++ 中实际上做了什么?
- 析构函数和'delete'之间的区别
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- 析构函数中的"delete this"
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 即使在使用 delete[] 后仍保留的元素
- 如果我在下面的代码片段中添加"delete[] d;",为什么我得到零?
- C++原始指针和"delete"
- 为什么 std::vector 使用 std::分配器而不是运算符 new 和 delete?
- 重载 new 和 delete 会导致 valgrind 错误
- 为什么"delete"操作员给我访问权限冲突
- 析构函数是否会自动调用 delete[] C++?
- C++"::delete"的目的是什么?
- 使用 delete [] 运算符取消分配类中数据成员的内存
- 基类指针:在哪里使用 new 和 delete