【问题标题】:RValue Pointers?RValue 指针?
【发布时间】:2013-03-13 03:31:14
【问题描述】:

我如何判断一个指针是 RValue 还是我不知道我在说什么。喝啤酒的时候,这个非常荒谬的想法突然出现在我的脑海里。

如果你有愚蠢的程序员/用户怎么办..

假设你有以下类:

template<typename T>
class Container
{
    private:
        std::vector<T> Storage;
    public:
        Container(T Anything) : Storage() {Storage.push_back(Anything);}
}

而用户这样做:

Container<Object*> C(new Object(Params));

那我怎么删除呢?我希望能够分辨出上面和下面的区别:

Object* O = new Object(Params);
Container<Object*> C(O);

我只是想知道。我知道显然不应该使用第一个示例,但让我们假设它将是或者我想检测这样的泄漏代码并删除它们。

如何做到这一点?那是一个 RValue 指针吗?我怎么称呼它?

【问题讨论】:

  • Container C(new Object(Params)); 是无意义的 - 必须指定 T 是什么类型,那么,它是什么?
  • 在这种情况下,T 是一个指针。哦,你的意思是像 Container(new Object())?
  • 哦……我修好了。对不起:(
  • @CantChooseUsernames: Read about expression value categories. 另外,这不是临时的
  • 指针是临时的,它指向的对象不是。这就是他似乎想在问题中谈论的内容,尽管他最近的评论似乎与这种解释相冲突。

标签: c++ c++11 rvalue


【解决方案1】:

最简单和正确的做法是将裸指针包装在一些资源容器中,例如shared_ptr

【讨论】:

  • 否,因为那样您将删除托管指针。您不想删除每个指针.. 只有愚蠢的泄漏指针。
  • @CantChooseUsernames : 如果它是共享的,它只会在 每个 实例超出范围时被删除。
  • shared_poiner 仅在资源计数达到零时删除。 auto_ptr 或 unique_poiner 提供单一资源所有权。
  • @CantChooseUsernames:是的,如果用户是个白痴,并且做了一些完全愚蠢和不直观的事情,比如在传递给 shared_ptr 的指针上调用 delete,它就会中断。你想做什么,保护用户免受他们可能犯的每一个可能的错误?即使你可以“修复”这个“问题”,糟糕的程序员也会发现其他事情搞砸。
  • @CantChooseUsernames:哦,没关系。您的示例中的问题是您的类构造函数。你不应该接受一个原始指针,然后将它传递给一个 shared_ptr。这是所有权的转移,它应该从一个确保调用者实际拥有所有权的对象开始。也就是说,构造函数应该获取一个 shared_ptr 并存储它的副本。
猜你喜欢
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2014-10-31
  • 1970-01-01
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多