*///test2 自定义删除器//不再调用Test的析构函数了//unique_ptr<Test, decltype(my_deleter)*> u(new Test(1), my_deleter);//test3 reset和release的使用/* unique_ptr<Test> p1(new Test(1)); unique_ptr<Test> p2(p1.release());//将p1置为空,p2指向了原来p1指向的对象 unique_ptr<Test>...
上述对于拷贝的限制,有两个特殊情况,即unique_ptr可以作为函数的返回值和参数使用,这时虽然也有隐含的拷贝存在,但是并非不可行的。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 unique_ptr<int>clone(intp) { returnunique_ptr<int>(newint(p)); } voidprocess_unique_ptr(unique_ptr<int>up) { cout<...
打印出【f2:0】的原因是,②处分离线程后,线程f1已经结束了,所以函数f1里的j已经被释放了,这时线程f2再访问j的时候就是0了。 4,unique_ptr作为参数传递,必须使用move函数 #include<iostream>#include<thread>#include<string>#include<unistd.h>using namespacestd;voidf1(unique_ptr<int> upt){cout<< *upt ...
void customDeleter(int* ptr) { // 释放C指针所指向的内存 delete ptr; } 接下来,可以使用unique_ptr模板类来创建一个unique_ptr对象,并将C指针与自定义删除器关联起来。使用unique_ptr的构造函数,将C指针作为参数传递,并将自定义删除器函数作为第二个参数传递。例如: ...
unique_ptr,是用于取代c++98的auto_ptr的产物,在c++98的时候还没有移动语义(move semantics)的支持,因此对于auto_ptr的控制权转移的实现没有核心元素的支持,但是还是实现了auto_ptr的移动语义,这样带来的一些问题是拷贝构造函数和复制操作重载函数不够完美,具体体现就是把auto_ptr作为函数参数,传进去的时候控制权转移...
make_unique提供了更简洁的构建语句。在复杂的表达式中,它也可以保证异常安全。 Example(示例) unique_ptr<Foo> p {new Foo{7}}; // OK: but repetitive auto q = make_unique<Foo>(7); // Better: no repetition of Foo // Not exception-safe: the compiler may interleave the computations of //...
unique_ptr:c++11版本,独占对所指对象的独有权,不允许其他的智能指针共享其内部的指针,禁止进行拷贝构造和拷贝赋值的操作,但是unique_ptr允许通过函数返回给其他的unique_ptr,还可以通过std::move来把所有权转让到其他的unique_ptr,注意,这时它本身就不再拥有原来指针的所有权了。将一个 unique_ptr 赋值给另一个时...
C++11引入了智能指针,如std::unique_ptr,std::shared_ptr和std::weak_ptr,它们可以自动管理内存,避免内存泄漏。智能指针与虚函数结合使用,可以更好地支持动态多态。 4.3.1 智能指针与虚函数 智能指针可以安全地管理动态分配的对象,当智能指针的生命周期结束时,它会自动删除它所管理的对象。如果这个对象是一个派生...
这可以通过使用std::unique_ptr或std::shared_ptr实现,例如: 技巧4:在函数结束时关闭文件 在函数中,应该在返回之前关闭文件。这可以通过将文件指针作为参数传递给函数,并在函数结束时调用fclose函数实现,例如: 技巧5:使用文件描述符 在Linux系统中,可以使用文件描述符来管理文件。文件描述符是一个整数值,用于唯一...
非专用版本(单个对象)独占:operator* 取消引用对象(公共成员函数)operator-> 取消引用对象成员(公共成员函数) 专用于具有运行时长度的数组的版本:operator[] 偏移访问(公共成员函数) 非成员函数重载 swap 交换unique_ptr对象的内容(函数模板) relational operators 关系运算符 ==, !=, <, <=, >, >= (函数模板...