2

以下代码:

class Something
{
public:
     ~Something()
    {
    }
};

int main()
{
    Something* s = new Something[1]; // raw pointer received from C api
    std::shared_ptr<Something> p = std::shared_ptr<Something>(s);
    std::vector<std::shared_ptr<Something>> v(&p,&p+1);

    return 0;
}

在 VS Express 2010 中出现以下错误:

---------------------------
Microsoft Visual C++ Debug Library
---------------------------
Debug Assertion Failed!

File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

从Something中删除析构函数,错误消失,为什么我会收到这个错误?

更新:

稍后我会有类似的东西:

Something* s = new Something[100];

并且各个共享指针将被传递给其他对象

4

2 回答 2

6
Something* s = new Something[1]; // raw pointer received from C api
std::shared_ptr<Something> p = std::shared_ptr<Something>(s); 

是不正确的用法,因为

~shared_ptr();

效果: — 如果 *this 为空或与另一个 shared_ptr 实例共享所有权(use_count() > 1),则没有副作用。

— 否则,如果 *this 拥有一个对象 p 和一个删除器 d,则调用 d(p)。

— 否则,*this 拥有指针 p,并调用 delete p。

默认删除器是operator delete,但您Something* s = new Something[1];已由 array-new 运算符分配,应该使用 array-delete 运算符 (delete[]) 删除,否则它是未定义的行为。您应该使用特定的删除器构造 shared_ptr,或者为数组使用一些东西,例如boost::shared_array.

例如这段代码是正确的。

template<typename T>
void deleter(T* p)
{
   delete[] p;
}

Something* s = new Something[1]; // raw pointer received from C api
std::shared_ptr<Something> p = std::shared_ptr<Something>(s, deleter<Something>);
于 2012-08-16T11:05:40.090 回答
1

假设你有一个充满动态分配指针的 C 数组,shared_ptr 向量的使用就大大简化了:

#include <vector>
#include <memory>

struct Foo { };

int main() {

  Foo* foos[5]; // simulate the array of pointers from C API
  foos[0] = new Foo();
  foos[1] = new Foo();
  foos[2] = new Foo();
  foos[3] = new Foo();
  foos[4] = new Foo();

  // create vector of shared_ptrs to C pointers
  std::vector<std::shared_ptr<Foo>> v(foos, foos+5);

}
于 2012-08-16T11:33:10.470 回答