之前,为了处理程序中的异常情况,往往需要将指针手动封装到类中,通过析构函数来释放动态分配的内存;现在这一过程就可以交给shared_ptr去做了。 一般我们使用make_shared来获得shared_ptr。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 cout<<"test shared_ptr base usage:"<<endl; shared_ptr<string>p1=mak...
shared_ptr 可以当作函数的参数传递,或者当作函数的返回值返回,这个时候其实也相当于使用复制构造函数。 过程如下:作函数实参时,将指针执行复制构造函数传入函数体内,因此该内存块的引用计数 1; 当作为函数返回值时,复制构造函数将内存地址传递给新指针,引用计数 1,然后,局部指针执行析构,引用计数-1。
//动态分配一个新对象,初始化值为39shared_ptr<int>ptr1=make_shared<int>(39);///动态分配一个新对象,初始化值为0shared_ptr<int>ptr2=make_shared<int>();//动态分配一个新对象,初始化值为39shared_ptr<int>ptr3(newint(39)); 在以上的代码中我们看到了三个申请内存和初始化方式,也是我们最常用的...
unique_ptr<int> p1(new int(11)); //unique_ptr<int> p2(p1);//NG unique_ptr<int> p3(new int(10)); //p3 = p1;//NG *///test2 自定义删除器//不再调用Test的析构函数了//unique_ptr<Test, decltype(my_deleter)*> u(new Test(1), my_deleter);//test3 reset和release的使用/* uni...
int* const function7(); // 返回一个指向变量的常指针,使用:int* const p = function7(); static 作用 修饰普通变量,修改变量的存储区域和生命周期,使变量存储在静态区,在 main 函数运行前就分配了空间,如果有初始值就用初始值初始化它,如果没有初始值系统用默认值初始化它。
std::string function; // 函数名 std::string args; // 函数参数 rs2_exception_type exception_type; // 错误类型 }; 如果一个函数返回一个结构体类型的值,那么需要使用一个结构体类型的变量来接收这个返回值。因为结构体类型通常比较大,如果直接将结构体类型的值作为函数的返回值返回,会导致复制整个结构体...
所有的智能指针类都有一个explicit构造函数,以指针作为参数。比如auto_ptr的类模板原型为: 1templet<classT>2classauto_ptr {3explicitauto_ptr(X* p =0) ;4...5}; 因此不能自动将指针转换为智能指针对象,必须显式调用: 1shared_ptr<double>pd;2double*p_reg =newdouble;3pd = p_reg;//not allowed ...
unique_ptr 可以实现如下功能: 1、为动态申请的内存提供异常安全 2、讲动态申请的内存所有权传递给某函数 3、从某个函数返回动态申请内存的所有权 4、在容器中保存指针 5、auto_ptr 应该具有的功能 unique_ptr<Test> fun() { return unique_ptr<Test>(new Test("789")); ...
在 function template 中,可以使用 template type parameters 来作为函数参数类型,返回值类型以及函数内部定义类型,例如 template <typename T> T foo(T* p){T tmp = *p; // ... return tmp;} 在较老的 C++标准中,还没有 typename 关键字,之前是用 class 关键字来当 typename 用的。不过在支持...