相关疑难解决方法(0)

为什么std :: shared_ptr <void>有效

我发现一些代码使用std :: shared_ptr在shutdown时执行任意清理.起初我认为这段代码不可行,但后来我尝试了以下内容:

#include <memory>
#include <iostream>
#include <vector>

class test {
public:
  test() {
    std::cout << "Test created" << std::endl;
  }
  ~test() {
    std::cout << "Test destroyed" << std::endl;
  }
};

int main() {
  std::cout << "At begin of main.\ncreating std::vector<std::shared_ptr<void>>" 
            << std::endl;
  std::vector<std::shared_ptr<void>> v;
  {
    std::cout << "Creating test" << std::endl;
    v.push_back( std::shared_ptr<test>( new test() ) );
    std::cout << "Leaving scope" << std::endl;
  }
  std::cout << "Leaving main" << std::endl;
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

该程序给出了输出:

At begin of main. …
Run Code Online (Sandbox Code Playgroud)

c++ shared-ptr c++11

125
推荐指数
5
解决办法
3万
查看次数

make shared_ptr不使用delete

在我的代码中,我希望boost :: shared_ptr不要调用delete但是调用ptr-> deleteMe()代替.

我还有一些C风格的函数返回一个ptr.我可以调用lib_freeXYZ(ptr); 而不是试图删除?

c++ boost

41
推荐指数
3
解决办法
2万
查看次数

共享的void指针.为什么这样做?

为了解决我的应用程序中一个非常特殊的问题,我需要一个指向已分配数据的共享指针,但对于外部世界,底层数据类型应保持隐藏状态.

我可以通过创建我的其他所有类继承的某种Root类来解决这个问题,并在此Root类上使用shared_ptr,如下所示:

std::shared_ptr<Root>
Run Code Online (Sandbox Code Playgroud)

然而:

  • 我不希望我的所有类都从这个Root类继承,只是为了能够拥有这个共享指针
  • 有时我想返回一个指向std :: vector,或std :: list或std :: set,...的共享指针,这显然不会从我的Root类继承

奇怪的是,似乎你可以在void上创建一个shared_ptr,这似乎工作正常,如下例所示:

class X
   {
   public:
      X() {std::cout << "X::ctor" << std::endl;}
      virtual ~X() {std::cout << "X::dtor" << std::endl;}
   };

typedef std::shared_ptr<void> SharedVoidPointer;

int main()
{
X *x = new X();
SharedVoidPointer sp1(x);
}
Run Code Online (Sandbox Code Playgroud)

x被正确删除,在一个更大的实验中,我可以验证共享指针确实完成了它需要做的事情(删除x,最后一个shared_ptr结束了灯光).

当然,这解决了我的问题,因为我现在可以使用SharedVoidPointer数据成员返回数据,并确保它正确地清理它应该在哪里.

但这是否可以保证在所有情况下都有效?它显然适用于Visual Studio 2010,但这是否也可以在其他编译器上正常工作?在其他平台上?

c++ smart-pointers shared-ptr visual-c++ c++11

20
推荐指数
2
解决办法
8222
查看次数

为什么shared_ptr <void>不是专门的?

shared_ptr<void>特别之处在于,通过定义,它将通过调用deletea 来调用未定义的行为void*.

那么,为什么没有shared_ptr<void>抛出编译错误的特化?

c++ pointers

6
推荐指数
2
解决办法
1078
查看次数

标签 统计

c++ ×4

c++11 ×2

shared-ptr ×2

boost ×1

pointers ×1

smart-pointers ×1

visual-c++ ×1