如何删除用于动态分配对象的智能指针
How to delete smart pointer to dynamically allocated object?
我制作了一个迭代器,当重新引入返回std::shared_ptr
的副本时,该副本指向动态分配的std::pair
(在迭代器内部中使用new
创建)。迭代器的功能原样,但希望在循环结束时释放pair
以防止内存泄漏。
for (auto it = parser.begin(); it != parser.end(); ++it) {
shared_ptr<pair<string, string>> record = *it;
// Analysis of pair
// delete pair with delete, or reset
}
但是,我在释放pair
方面遇到困难。我尝试过delete record
,delete *record
和record.reset()
,但是这些都不会编译。
shared_ptr
旨在自动删除其管理的对象,一旦不再需要。当不再共享指针指向对象时(例如,指向同一对象的所有共享指针均已删除或重置以指向另一个对象时,就会发生这种情况。
无需自己删除它。通过设计,甚至无法直接删除对象,因为这可能会导致一些悬空的指针和不一致之处。
unique_ptr
是另一种智能指针。它们旨在保留分配的对象的所有权,并在销毁独特的指针本身时销毁对象。
再次,无需自己删除对象。unique_ptr
的创建是为了释放您的职责。但是在这里,您可以通过重置指针来破坏托管对象。由于指针是独一无二的,因此在这里制作悬空的指针没有风险。
最后,还有 weak_ptr
。这些不拥有一个对象,而是参考某些shared_ptr
管理的对象。这个想法是,弱_ptr的存在并不能阻止删除对象。由于weak_ptr
不拥有对象,无论您做什么,它都无法删除它。
对于我的智能指针,该指针已删除了运算符,我使用
struct DeleteIt
{
template < typename T >
void operator() ( const T* ptr ) const
{
delete ptr ;
}
template < typename T >
void operator() ( const safeptr< T >& ptr ) const
{
delete &ptr ;
}
} ;
和7.3和8.2之类的较新的海湾合物
// this is okay for modern GCC
for ( std::vector< safeptr< Item > >::const_iterator it = items.begin () ; it != items.end () ; ++ it )
{
delete *it ;
}
// this works with any GCC
for ( std::vector< safeptr< Item > >::const_iterator it = items.begin () ; it != items.end () ; ++ it )
{
delete &( *it ) ;
}
但是,诸如4.0.x之类的gcc不
相关文章:
- 对具有动态分配的内存和析构函数的类对象的引用
- 我有一个对象,它将在整个程序的持续时间内实例化,但一个类成员不会,我应该动态分配它吗?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 销毁C++中动态分配的内存(数组对象)
- C++ 将抽象类型的动态分配对象传递给函数并存储在向量中
- 动态分配的对象未初始化
- std::p air 会破坏其动态分配的对象吗?
- 动态分配对象中的字段-动态分配更好还是静态分配更好?C++
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 使用私有析构函数删除动态分配的对象
- 动态分配许多 Boost::直方图对象
- 如何使用每个对象的单个构造函数参数动态分配C++对象数组?
- 将动态分配对象传递到 boost::any 构造函数中
- 将动态分配的对象添加到对象指针数组中
- 如何删除列表中的动态分配类对象<T>?
- 处理另一个类中类动态分配的对象数组
- 如何使用一些参数初始化动态分配的数组中的对象
- 使用 new: "potentially uninitialized pointer"将对象数组动态分配给指针
- 如何复制或返回包含动态分配的内存的对象
- C 删除指向动态分配对象的指针