qq_33707711
Mr-Luer
采纳率48.6%
2018-07-10 13:52

unique_ptr在linux找不到标识符

5
已采纳

在windows下这样写这样代码ok:
#include (memory)
using namespace std ;
unique_ptr(ClassName>)p (new ClassName())

但在linux下就报错说unique_ptr找不到标识符,这是为什么啊
(尖括号显示不出来,用普通括号替代,大家应该懂的)

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

8条回答

  • enjoymcu enjoymcu 3年前

    是不是编译方式的问题!
    尝试:
    g++ main.cpp -o app -std=c++11

    点赞 1 评论 复制链接分享
  • qq_41633915 qq_41633915 3年前

      对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们需要时刻记得释放,且不能重复释放,释放后不能再去使用... 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了,智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放,对动态内存做到一个比较好的管理

      unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作

      unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

    点赞 1 评论 复制链接分享
  • qq_33707711 Mr-Luer 3年前

    上面#include貌似显示不出来

    点赞 1 评论 复制链接分享
  • qq_35302675 qq_35302675 3年前

      unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作

      unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

    点赞 评论 复制链接分享
  • weixin_42597696 无名之辈路人乙 3年前

    上面#include貌似显示不出来,问题出现在这

    点赞 评论 复制链接分享
  • MrC333168 MrC333168 3年前

    在标准C++以前,都是用#include这样的写法的,因为要包含进来的头文件名就是iostream.h。标准C++引入了名字空间的概念,并把iostream等标准库中的东东封装到了std名字空间中,同时为了不与原来的头文件混淆,规定标准C++使用一套新的头文件,这套头文件的文件名后不加.h扩展名,如iostream、string等等,并且把原来C标准库的头文件也重新命名,如原来的string.h就改成cstring(就是把.h去掉,前面加上字母c),所以头文件包含的写法也就变成了#include 。
    并不是写了#include就必须用using namespace std;我们通常这样的写的原因是为了一下子把std名字空间的东东全部暴露到全局域中(就像是直接包含了iostream.h这种没有名字空间的头文件一样),使标准C++库用起来与传统的iostream.h一样方便。如果不用using namespace std;使用标准库时就得时时带上名字空间的全名,如std::cout << "hello" << std::endl;
    #include "iostream"与#include的区别:前者先在当前目录找iostream文件,找不到再去系统头文件路径找,后者反之。因此,做为一个良好的习惯,在包含系统头文件时尽量用<>,而在包含自己的工程中的头文件时用""。
    和不一样,前者没有后缀,实际上,在编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。
    后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。
    因此,当使用时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用< iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。
    #include
    using namespace std; 则出错

    点赞 评论 复制链接分享
  • qq_40384078 GavinGay 3年前

    对于动态申请的内存,C++语言为我们提供了new和delete运算符, 而没有像java一样,提供一个完整的GC机制,因此对于我们申请的动态内存,我们需要时刻记得释放,且不能重复释放,释放后不能再去使用... 因此在使用时造成很多不便,且容易出现很多问题,一旦出问题就造成core dump,程序直接挂掉 , 这个时候,智能指针的优势就体现出来了,智能指针符合RAII原则,资源获取就是初始化,在对象析构时,将资源进行释放,对动态内存做到一个比较好的管理
      unique_ptr 持有对对象的独有权—两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作
      unique_ptr拥有所有auto_ptr的功能,且unique_ptr通过将复制构造和赋值操作符私有化,将对象的所有权独有,很好的将auto_ptr的安全问题给规避掉了,unique_ptr的其他特点包括:1.提供删除器释放对象,允许用户自定义删除器 2.添加了对象数组的偏特化实现,new[],delete[] 3.使用C++ 11的右值引用特性,实现所有权转移 std::move()

    点赞 评论 复制链接分享
  • qq_41633915 qq_41633915 3年前

    unique_ptr
    unique_ptr是一种定义在中的智能指针(smart pointer)。

    它持有对对象的独有权——两个unique_ptr不能指向一个对象,不能进行复制操作只能进行移动操作。

    简介
    unique_ptr在超出作用域,即以下情况时它指向的对象会被摧毁:

    unique_ptr指向的对象被破坏

    对象通过operator=()或reset()被指定到另一个指针)

    unique_ptr还可能没有对象,这种情况被称为empty。

    例如:

    std::unique_ptrp1(new int(5));

    std::unique_ptrp2=p1;// 编译会出错

    std::unique_ptrp3=std::move(p1);// 转移所有权, 现在那块内存归p3所有, p1成为无效的针.

    p3.reset();//释放内存.

    p1.reset();//无效

    使用
    unique_ptr的功能

    不管是正常退出还是异常退出,均可通过保证删除为处理拥有动态寿命的类和函数提供额外的保护;

    将独有的持有动态寿命对象传递给函数;

    从函数获取持有动态寿命对象的所有权

    所有auto_ptr应该已经具有的功能

    概要
    unique_ptr十分依赖于右值引用和移动语义。

    下面是一段传统的会产生不安全的异常的代码:

    X* f() { X* p =new X; // 做一些事情 – 可能会抛出某个异常 return p; }

    解决方法是,用一个unique_ptr 来管理这个对象的所有权,由其进行这个对象的删除释放工作:

    X* f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X // 做一些事情 – 可能会抛出异常return p.release(); }

    现在,如果程序执行过程中抛出了异常,unique_ptr就会(毫无疑问地)删除释放它所指向的对象,这是最基本的RAII。但是,除非我们真的需要返回一个内建的指针,我们可以返回一个unique_ptr,让事情变得更好。

    unique_ptr f() { unique_ptr p(new X); // 或者使用{new X},但是不能 = new X //做一些事情 – 可能会抛出异常return p; // 对象的所有权被传递出f() }

    现在我们可以这样使用函数f():

    void g() { unique_ptr q = f(); // 使用移动构造函数(move constructor) q->memfct(2); // 使用q X x = *q; // 复制指针q所指向的对象 // … } // 在函数退出的时候,q以及它所指向的对象都被删除释放

    unique_ptr拥有“移动意义(move semantics)”,所以我们可以使用函数f() 返回的右值对q进行初始化,这样就简单地将所有权传递给了q。

      在那些要不是为了避免不安全的异常问题(以及为了保证指针所指向的对象都被正确地删除释放),我们不可以使用内建指针的情况下,我们可以在容器中保存unique_ptr以代替内建指针:

    vector

    点赞 评论 复制链接分享

相关推荐