make_shared重写删除函数
时间: 2024-09-19 21:04:58 浏览: 41
`make_shared` 是 C++11 引入的一个智能指针工厂函数,它用于创建共享所有权的 `shared_ptr` 对象。标准库提供这个函数的主要目的是为了简化动态内存分配和资源管理,尤其是避免手动管理析构顺序带来的问题。
当你需要创建一个 `shared_ptr` 并立即传给它所指向的对象时,`make_shared` 可以帮到你。它的语法类似这样:
```cpp
auto ptr = std::make_shared<SomeType>(arg1, arg2);
```
`make_shared` 内部会自动调用对象的构造函数,并返回一个拥有该对象所有权的 `shared_ptr`。此外,如果你尝试删除(通过 `delete` 关键字)由 `make_shared` 创建的对象,实际上不需要显式地这样做。`shared_ptr` 的生命周期管理是由其内部计数器控制的,当所有持有它的 `shared_ptr` 引用失效(即没有其他引用指向),系统会在适当的时机自动调用析构函数释放内存。
需要注意的是,`make_shared` 没有直接对应的 "删除" 函数,因为当你不再需要一个 `shared_ptr` 时,只需让最后一个引用置空(`ptr.reset()` 或 `ptr = nullptr`)即可,这会让 `shared_ptr` 自动调用析构函数。
相关问题
class isotropic : public material { public: isotropic(color c) : albedo(make_shared<solid_color>(c)) {} isotropic(shared_ptr<texture> a) : albedo(a) {} virtual bool scatter( const ray& r_in, const hit_record& rec, color& attenuation, ray& scattered ) const override { scattered = ray(rec.p, random_in_unit_sphere(), r_in.time()); attenuation = albedo->value(rec.u, rec.v, rec.p); return true; } public: shared_ptr<texture> albedo; };
这是 C++ 中的一个类 isotropic,它继承了 material 类。isotropic 类是一个各向同性材质,它可以用来模拟一些毛茸茸的物体,如绒毛、云朵等。它有两个构造函数:
1. isotropic(color c):接收一个颜色参数,用于构造一个实心颜色(solid_color)纹理;
2. isotropic(shared_ptr<texture> a):接收一个纹理智能指针参数,用于构造一个纹理材质。
isotropic 类中重写了 material 类中的 scatter 函数,用来描述光线散射的行为。在 scatter 函数中,首先生成一个随机的散射光线(scattered),然后通过 albedo 纹理计算出衰减系数(attenuation),最后返回 true 表示光线成功发生了散射。
c++ makeshared lambda 重写释放函数
在 C++ 中,`std::make_shared<T>` 和 `lambda` 结合使用可以创建带有一致内存管理的动态对象。当你使用一个 lambda 表达式作为 `make_shared` 的构造函数参数时,`make_shared` 将自动管理该对象的生命周期,并确保其析构函数会在合适的时机(即共享计数为0时)被调用。
如果你想要自定义 lambda 对象的释放行为,通常涉及到重写析构函数(通过将它包装在一个可调用对象中)。例如:
```cpp
#include <memory>
#include <functional>
class CustomDeleter {
public:
void operator()(MyLambdaType lambda) {
// 这里是你想要执行的释放操作,比如清理资源
lambda.cleanup();
}
};
std::shared_ptr<MyLambdaType> my_lambda = std::make_shared<MyLambdaType>([](auto arg) { /* lambda body */ }, CustomDeleter{}); // 使用 CustomDeleter 自定义释放行为
```
在这个例子中,`CustomDeleter` 类的实例将会在 `my_lambda` 被销毁时执行 `cleanup` 函数,而不是默认的行为。这样,你可以控制 lambda 释放时的具体操作。
阅读全文