gpt4 book ai didi

C++11 替代 boost::checked_delete

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:48:23 24 4
gpt4 key购买 nike

作为前向声明的重度用户,我喜欢我的类在销毁时完成。为确保这一点,我将析构函数设为私有(private)并与 boost::checked_delete 成为 friend :

#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. 如何让标记为 (1) 的行进行编译? std::make_shared 的使用是一件好事
  2. 标记为 (2) 的行是否真的有效?显式指定deleter感觉不好

我使用的是 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);

关于C++11 替代 boost::checked_delete,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22091559/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com