检查以下代码:
这样做是可行的:
T *p = (std::find( this->first(), this->last(), *pPos ));
if( p != last() )
{
this->push_back(data);
T *right = (this->last() - 1);
T *left = (this->last() - 2);
while( *pPos != data )
std::iter_swap( left--, right-- );
return const_cast<T*>(pPos);
}这并不意味着:
boost::scoped_ptr<T> p(std::find( this->first(), this->last(), *pPos ));
if( p.get() != last() )
{
this->push_back(data);
T *right = (this->last() - 1);
T *left = (this->last() - 2);
while( *pPos != data )
std::iter_swap( left--, right-- );
return const_cast<T*>(pPos);
}第二个版本提供了一个运行时错误
Expression: _BLOCK_TYPE_IS_VALID_(pHead->nBlockUse)
这意味着我的scoped_ptr不是太快就超出了范围,就是在做一些让它失效的奇怪的事情。
我的scoped_ptr怎么了?
增编:
我不能删除任何指针。这是正常的吗?即使我删除了右/左,我也会得到相同的错误,即使返回时不再引用它们。
发布于 2010-10-11 19:29:17
boost::scoped_ptr将在指针(即boost::scoped_ptr实例)超出作用域时删除它。我认为您不想删除指针,它似乎是类中的迭代器。
发布于 2010-10-11 19:30:41
scoped_ptr用于本地堆分配的内存。它破坏包含的对象,并在退出作用域时释放它。
试图在块中间释放内存(如find将返回的内存)是非法的。如果不拥有某一物品,就会造成双重破坏,这也是非法的。
这里只需不要使用scoped_ptr。
发布于 2010-10-11 19:30:54
假设这个->first()\end()返回一个常规指针,则当函数结束时,任何p点的析构函数都会被调用。
如果std::find返回这个->last(),那么将调用未初始化变量的析构函数。
https://stackoverflow.com/questions/3909309
复制相似问题