定义一个模板std::unique_ptr
时间: 2024-03-02 13:46:31 浏览: 20
std::unique_ptr是C++11引入的智能指针,用于管理动态分配的对象。它提供了独占所有权的语义,即同一时间只能有一个unique_ptr指向一个对象。
定义一个std::unique_ptr的模板可以使用以下语法:
```cpp
std::unique_ptr<T> ptr;
```
其中,T是指向的对象的类型。通过这种方式定义的unique_ptr默认为空指针,不指向任何对象。
可以使用new关键字来创建一个对象,并将其分配给unique_ptr:
```cpp
std::unique_ptr<T> ptr(new T);
```
这样,unique_ptr就拥有了对该对象的所有权。当unique_ptr超出作用域或被显式释放时,它会自动调用delete来释放所管理的对象。
此外,还可以使用make_unique函数来创建一个unique_ptr,并自动分配和构造对象:
```cpp
std::unique_ptr<T> ptr = std::make_unique<T>(args);
```
这种方式更加安全,因为它可以避免显式使用new和delete,从而减少内存泄漏和资源泄漏的风险。
相关问题
std::auto_ptr缺少模版
std::auto_ptr 是 C++98 标准库中的智能指针,它是一个模板类,用于管理动态分配的对象的所有权。然而,在 C++11 标准中,std::auto_ptr 被弃用,并在 C++17 中被移除。
取而代之的是 std::unique_ptr,它也是一个模板类,提供了更好的语义和功能。如果你需要一个拥有唯一所有权的智能指针,你应该使用 std::unique_ptr。
std::unique_ptr 在头文件 <memory> 中定义,你需要包含这个头文件才能使用它。下面是一个使用 std::unique_ptr 的示例:
```cpp
#include <memory>
int main() {
std::unique_ptr<int> ptr(new int(42));
// 使用 ptr 指向的对象
std::cout << *ptr << std::endl;
// unique_ptr 在作用域结束时会自动释放资源
return 0;
}
```
请注意,与 std::auto_ptr 不同的是,std::unique_ptr 不能共享所有权。如果你需要共享所有权,你可以使用 std::shared_ptr。
std::make_unique()的成员函数有哪些
`std::make_unique()` 不是一个类的成员函数,而是一个模板函数,定义在 `<memory>` 标准头文件中。它用于创建一个唯一指针,其返回类型是 `std::unique_ptr<T>`(其中 T 是指针指向的类型)。
因此,`std::make_unique()` 没有自己的成员函数。但是,它可以用于创建对象并调用对象的成员函数,例如:
```cpp
#include <memory>
#include <iostream>
class MyClass {
public:
void myFunction() {
std::cout << "Hello World!" << std::endl;
}
};
int main() {
auto myUniquePtr = std::make_unique<MyClass>();
myUniquePtr->myFunction(); // 调用 MyClass 的成员函数
return 0;
}
```
在上面的示例中,我们使用 `std::make_unique()` 创建了一个 `MyClass` 的唯一指针 `myUniquePtr`,并通过 `->` 运算符调用了 `MyClass` 的成员函数 `myFunction()`。