C++ vector中存放指针,从vector里面取出的一个指针应该释放空间吗?

零、小序

vector是C++程序员经常使用的一种序列化容器,可以说C++程序员每天都在使用,vector中可以存放各种类型的数据,使用起来简单方便。vector用来存放指针这不是一个新鲜事,vector释放空间也不是新鲜事,那么从vector中单独取出来一个指针,这个指针使用完需要单独释放空间吗?你知道吗?不知道的来看看,知道的绕道吧。

一、先来看一段代码

1、代码示例

// TestArray2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>

using namespace std;

class Person
{
public:
    int age;
};

int main()
{
    vector<Person*> tmpVector;
    for (int i=1; i<10; ++i)
    {
        Person *pPerson = new Person;
        pPerson->age = i;
        tmpVector.emplace_back(pPerson);
    }

    Person *tmpPerson = tmpVector.at(0);
    if (tmpPerson != nullptr)
    {
        delete tmpPerson;
        tmpPerson = nullptr;
    }
    for (auto iter=tmpVector.begin(); iter!=tmpVector.end(); ++iter)
    {
        if (*iter != nullptr)
        {
            delete (*iter);
            (*iter) = nullptr;
        }
    }
    // 清空vector数据并释放空间
    tmpVector.clear();
    vector<Person*> tmpSwapVector;
    tmpSwapVector.swap(tmpVector);

    std::cout << "Hello World!n";
    getchar();
}

2、这段代码能正常运行吗

答案:当然是不能的!而且程序会崩溃!原因就是从vector中取出的tmpPerson单独释放了空间,导致tmpVector中存储的第一个指针变成了野指针,tmpPerson和tmpVector[0]指向的是同一块内存地址,同一块地址释放两次空间肯定会崩溃的!只需要在tmpVector中释放空间就可以了。

3、运行现象

VS2017下面,可以看到崩溃了,并且自动跳转到和内存释放的代码库中。
在这里插入图片描述

二、正确的示范

下面的代码中使用条件编译把有问题的代码注释掉了,并加了注释说明。

// TestArray2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <vector>

using namespace std;

class Person
{
public:
    int age;
};

int main()
{
    vector<Person*> tmpVector;
    for (int i=1; i<10; ++i)
    {
        Person *pPerson = new Person;
        pPerson->age = i;
        tmpVector.emplace_back(pPerson);
    }
    cout << "-------------打印vector中所有指针的地址------------" << endl;
    for (auto iter : tmpVector)
    {
        cout << iter << endl;
    }

    cout << "-------------打印从vector中取出的指针的地址------------" << endl;
    Person *tmpPerson = tmpVector.at(0);
    cout << tmpPerson << endl;

#if 0
    // 这里不需要释放,后面释放数组中的空间就可以了
    // 如果在这里释放的话,vector的第一个指针会变成野指针,后面再释放vector空间时程序会崩溃
    if (tmpPerson != nullptr)
    {
        delete tmpPerson;
        tmpPerson = nullptr;
    }
#endif

    for (auto iter=tmpVector.begin(); iter!=tmpVector.end(); ++iter)
    {
        if (*iter != nullptr)
        {
            delete (*iter);
            (*iter) = nullptr;
        }
    }
    // 清空vector数据并释放空间
    tmpVector.clear();
    vector<Person*> tmpSwapVector;
    tmpSwapVector.swap(tmpVector);

    std::cout << "Hello World!n";
    getchar();
}

运行结果:
在这里插入图片描述

能力有限,如有错误,多多指教!原创不易,点赞鼓励一下吧!

原文链接: https://www.cnblogs.com/ISmileLi/p/12699730.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++ vector中存放指针,从vector里面取出的一个指针应该释放空间吗?

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/338098

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午11:26
下一篇 2023年3月1日 下午11:26

相关推荐