C++序列容器存储智能指针详解
http://c.biancheng.net/view/482.html
通常用容器保存指针比保存对象更好,而且大多数时候,保存智能指针比原生指针好。下面是一些原因:
- 在容器中保存指针需要复制指针而不是它所指向的对象。复制指针通常比复制对象快。
- 在容器中保存指针可以得到多态性。存放元素基类指针的容器也可以保存其派生类型的指针。当要处理有共同基类的任意对象序列时,这种功能是非常有用的。应用这一特性的一个常见示例是展示一个含有直线、曲线和几何形状的对象序列。
- 对指针容器的内容进行排序的速度要比对对象排序快;因为只需要移动指针,不需要移动对象。
- 保存智能指针要比保存原生指针安全,因为在对象不再被引用时,自由存储区的对象会被自动删除。这样就不会产生内存泄漏。不指向任何对象的指针默认为 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 ++;
}