zoukankan      html  css  js  c++  java
  • Vector成员为指针时要注意的问题

    vector的复制是浅复制,所以复制一个包含动态内存的变量的对象的话就会出问题.
    解决办法:自己写类的复制构造函数,为新对象的指针开辟新的内存空间。
    但当vector离开作用域之后,只会把其成员所占的内存删除(即指针),而不会删除指针指向的内存,就会出现内存泄露。
    解决办法:使用智能指针。
     1 #include <iostream>
     2 #include <memory>
     3 #include <vector>
     4 using namespace std;
     5 
     6 class A {
     7 public:
     8     ~A(){
     9         cout<<"delete"<<endl;
    10     }
    11 };
    12 
    13 void main()
    14 {
    15     vector<auto_ptr<A> > tmp;
    16     tmp.push_back(auto_ptr<A>(new A()));
    17     tmp.push_back(auto_ptr<A>(new A()));
    18 }

    输出结果:

    a delete

    a delete

    通过输出结果可知,tmp在结束生命周期的时候,智能指针会把其作用指针所指向的内存释放。

     1 #include <iostream>
     2 #include <memory>
     3 #include <vector>
     4 using namespace std;
     5 
     6 class A {
     7 public:
     8     ~A(){
     9         cout<<"delete"<<endl;
    10     }
    11 };
    12 
    13 void main()
    14 {
    15     vector<A*> tmp;
    16     tmp.push_back(new A());
    17     delete tmp[0];
    18 }
    若然没有最后的 delete tmp[0]
    程序是不会输出 a delete,因为vector只delete了指针(A*是元素类型),而没有删除指针指向的内容,造成内存泄露。
    程序结束会直接把整个vector所占的内存回收掉。
    Coding Life
  • 相关阅读:
    扫描线 leetcode 759
    创建tensor的方法
    vector
    scatter_
    size、shape
    复杂问题
    random.normal
    set
    将可迭代对象中的元素通过字典映射成数字
    zipfile.ZipFile
  • 原文地址:https://www.cnblogs.com/lewiskyo/p/4604839.html
Copyright © 2011-2022 走看看