[英]std::vector of std::shared_ptr usage
以下代码:
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];
并且各个共享指针将传递给其他对象
Something* s = new Something[1]; // raw pointer received from C api
std::shared_ptr<Something> p = std::shared_ptr<Something>(s);
是不正确的用法,因为
~shared_ptr();
效果:—如果*为空或与另一个shared_ptr实例共享所有权(use_count()> 1),则没有副作用。
—否则,如果*这拥有一个对象p和一个删除器d,则调用d(p)。
—否则,*这拥有一个指针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>);
假设您有一个充满动态分配的指针的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);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.