C++序列容器存储智能指针详解

http://c.biancheng.net/view/482.html

通常用容器保存指针比保存对象更好,而且大多数时候,保存智能指针比原生指针好。下面是一些原因:

  1. 在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。
  2. 在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。当要处理有共同基类的任意对象序列时,这种功能是非常有用的。应用这一特性的一个常见示例是展示一个含有直线、曲线和几何形状的对象序列。
  3. 对指针容器的内容进行排序的速度要比对对象排序快;因为只需要移动指针,不需要移动对象。
  4. 保存智能指针要比保存原生指针安全,因为在对象不再被引用时,自由存储区的对象会被自动删除。这样就不会产生内存泄漏。不指向任何对象的指针默认为 nullptr。

这里删除了一个指针,但它所指向的内存仍然存在(这是容器中的原生指针常见的内存泄漏来源。)。无论什么时候删除一个是原生指针的元素,都需要首先释放它所指向的内存:

std::vector<std::string*> words;
std::string word;
std::cout << "Enter words separated by spaces, enter Ctrl+Z on a separate line to end: \n";
while (true)
{
    if ((std::cin >> word).eof())
    {
        std::cin. clear();
        break;
    }
    words.push_back(new std::string {word});// Create object and store its address
}

for (auto iter = std::begin(words); iter != std::end(words);)
{
    if (**iter == "one")
    {
        delete *iter;//Release the memory...
        words.erase (iter);    //... then delete the pointer
    }
    else
        ++iter;
}

1.C++的Vector 保存原始指针 的时候 Vector 析构的时候是不会释放指针指向的堆对象,
2.如果用Vector保存智能指针是可以释放智能指针 所指向的对象的

使用new和delete管理动态内存常见问题
忘记delete内存。会导致内存泄漏。
使用已经释放掉的内存。通常在释放内存之后将指针置为空,来检测这种错误。
同一块内存被释放两次,自由空间可能被破坏。

https://blog.csdn.net/y1196645376/article/details/52938474
for(auto it = vi.begin();it != vi.end();)
{
if(*it == 3) it = vi.erase(it);
else it ++;
}
图片说明

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务