C++:动态内存管理

很久没写

之前有个笑话,是说:几个程序员去餐厅吃饭,那个会把盘子放回原地的一定是C/C++程序员,因为他们要自己清理内存.

好了,来上题目.

编写函数,返回一个动态分配的int的vector.将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在vector元素中.再将vector传递给另一个函数.打印读入的值.记得在恰当的时候delete vector.

小心:动态内存管理容易出错

使用new和delete管理动态内存存在三个问题:

  1. 忘记delete内存,会导致内存泄漏,而且不容易发现.
  2. 使用已经释放掉的对象.有时可以检测出这种错误.
  3. 同一块内存释放两次.

相对于发现“罪证”,制造“罪证”显然容易多了。

C++.
image-2150

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*************************************************************************
    > File Name: test.12.6.cpp
    > Author: puruidong
    > Mail: 1@w1520.com
    > Created Time: 2014年07月25日
 ************************************************************************/

#include<iostream>
#include<new>
#include<vector>
using namespace std;

/************************************
 
    编写函数,返回一个动态分配的int的vector.将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在vector元素中.再将vector传递给另一个函数.打印读入的值.记得在恰当的时候delete vector.


 *********************************************/

//输出vector中的内容,并释放内存
void outputvector(vector<int>* vec)
{
    cout << "\noutputvector\n" << endl;
    for(const auto &n:*vec)
    {
        cout << n << endl;
    }
    delete vec;//一定要释放内存.
    /*
   
    下面这一行代码是为了避免"空悬指针"的出现而
    添加的.
   
    执行下面这一行代码之后,vec将不能再次使用.
     
     
     */
    vec=nullptr;
    //报错.cout << vec->size() << endl;
}


//获取动态vector.
vector<int>* getve()
{
    vector<int> *vec=new vector<int>;
    return  vec;
}


//接收标准输入.
void inputvector()
{
    vector<int> *vec=getve();
    int pa ;
    cout << "动态内存分配,请输入数字:" << endl;  
    while(cin >> pa)
    {
        vec->push_back(pa);
   }
    outputvector(vec);
}

int main()
{
    inputvector();
    return 0;
}