shared_ptr delete
时间: 2023-08-04 22:03:06 浏览: 146
shared_ptr是C++11引入的智能指针,用于管理动态分配的内存。它使用引用计数的方式来跟踪资源的所有者,并在没有所有者时自动释放内存。当我们想要删除shared_ptr指向的对象时,我们不需要显式地调用delete。
使用shared_ptr的方式如下:
```cpp
#include <memory>
int main() {
// 创建一个shared_ptr,指向一个int类型的对象
std::shared_ptr<int> ptr(new int(42));
// 使用shared_ptr指向的对象
std::cout << *ptr << std::endl;
// 不需要显式地调用delete,当所有shared_ptr释放时,内存会自动释放
return 0;
}
```
在上述示例中,我们创建了一个指向int类型对象的shared_ptr,并使用*ptr访问该对象。当ptr超出作用域时(例如,函数返回或块结束),由于没有其他shared_ptr指向该对象,该对象会被自动释放。
总结起来,使用shared_ptr可以避免手动调用delete来释放内存,它提供了方便且安全的内存管理机制。
相关问题
shared_ptr自定义delete
在使用 `std::shared_ptr` 时,我们可以通过自定义删除器(deleter)来指定内存释放的方式。自定义删除器是一个可调用对象,它负责在 `shared_ptr` 的引用计数变为零时释放对象。
下面是一个例子,使用 lambda 表达式自定义删除器:
```c++
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass(int id) : m_id(id) {
std::cout << "MyClass(" << m_id << ") constructed\n";
}
~MyClass() {
std::cout << "MyClass(" << m_id << ") destructed\n";
}
void foo() {
std::cout << "MyClass(" << m_id << "): foo()\n";
}
private:
int m_id;
};
int main() {
// 自定义删除器
auto deleter = [](MyClass* p) {
std::cout << "Deleting MyClass(" << p->m_id << ") with custom deleter\n";
delete p;
};
// 使用自定义删除器创建 shared_ptr
std::shared_ptr<MyClass> p(new MyClass(1), deleter);
p->foo(); // 正常调用
// 重置 shared_ptr,会调用自定义删除器
p.reset(new MyClass(2), deleter);
return 0;
}
```
输出:
```
MyClass(1) constructed
MyClass(1): foo()
Deleting MyClass(1) with custom deleter
MyClass(2) constructed
Deleting MyClass(2) with custom deleter
```
可以看到,在 `shared_ptr` 引用计数变为零时,自定义删除器会被调用,释放对象。在本例中,自定义删除器只是简单地使用 `delete` 释放对象,但你可以根据需要来自定义删除器,以实现更灵活的内存管理方式。
shared_ptr 例程
shared_ptr是C++标准库中的智能指针之一,用于管理动态分配的内存资源。它提供了自动的内存管理和资源释放,可以避免内存泄漏和悬空指针的问题。
下面是一个shared_ptr的例程:
```cpp
#include <iostream>
#include <memory>
class MyClass {
public:
MyClass() {
std::cout << "MyClass constructor" << std::endl;
}
~MyClass() {
std::cout << "MyClass destructor" << std::endl;
}
void doSomething() {
std::cout << "Doing something..." << std::endl;
}
};
int main() {
// 创建一个shared_ptr对象,指向一个MyClass对象
std::shared_ptr<MyClass> ptr(new MyClass());
// 使用shared_ptr对象调用成员函数
ptr->doSomething();
// shared_ptr会在不再需要时自动释放内存资源,无需手动delete
return 0;
}
```
在上面的例程中,我们首先创建了一个shared_ptr对象`ptr`,并通过`new`关键字动态分配了一个MyClass对象,并将其地址传递给shared_ptr。当我们使用`ptr`调用成员函数`doSomething()`时,它会像普通指针一样访问MyClass对象的成员函数。
当程序执行完毕时,shared_ptr会自动释放内存资源,调用MyClass对象的析构函数进行清理工作。