使用 std::vector<> 和 std::shared_ptr<> 应该会导致错误
Using std::vector<> and std::shared_ptr<> should cause error
下面是我所做的代码:
#include <iostream>
#include <vector>
#include <memory>
using namespace std;
int main()
{
vector<int> ar = {1};
shared_ptr<int> sp(&ar[0]);
cout<<*sp<<endl; // ---- [1]
ar[0] = 10;
cout<<*sp<<endl; // ---- [2]
ar.clear();
cout<<*sp<<endl; // ---- [3]
return 0;
}
输出将是:
1
10
10
而不是cout
at [3]
,我认为在运行时应该有任何错误,因为要访问的对象已经被删除了。如何在[3]
中打印10
?或者我应该使用任何g++
标志,我只是使用g++ -std=c++14 a1.cpp && ./a.out
编辑:在Coliru上运行时,我发现clang++
正在给予
`*** glibc detected *** ./a.out: double free or corruption (fasttop): 0x0000000002138010 ***`
但g++
不是Coliru。
当你试图访问vector的当前边界外时,你基本上绕过了任何可能导致运行时错误的因素。
如果你想检查边界,你可以考虑这样做:
std::vector<int> ar { 1 };
std::cout << ar.at(0); // no problem
ar.clear();
std::cout << ar.at(0); // guaranteed to throw an exception
shared_ptr
表示对象的共享所有权,因此只有当对象没有剩余所有权时才会删除它。相比之下,std::vector
假定单独拥有它所包含的所有对象,因此试图用shared_ptr
引用其中一个对象只会导致问题。
shared_ptr
和std::vector
都将尝试释放shared_ptr
所引用的int
——但是没有要求这样做会导致错误消息(正式地说,这是一个实现质量问题,尽管我当然同意显示消息总比不显示好)。
您的代码中有几处错误。最明显的一个是,您正在创建一个shared_ptr
来管理一个已经由vector
管理的对象,并且很可能在main
的末尾得到双重删除。
另一个问题是,你有一个指向对象的指针,并在对象被删除后使用它,因为std::vector<int>::clear
不会释放内存,你正在击中仍然由向量管理的内存,这就是为什么它不会爆炸,但对象不再存在了,你不应该访问它。如果不是int
而是std::string
,程序可能会崩溃(也可能没有崩溃,这是未定义行为的本质)
这是一个未定义行为。它可以打印,也可以不打印。
std::vector::clear()
删除了对象,不保证重新分配。因此,系统可能不会重用该内存,因此如果访问相同的内存位置,可能会得到旧值。
有一个有趣的观察,如果在std::vector::clear()
操作之后检查std::shared_ptr::use_cout()
,可以看到答案1。
vector<int> ar = {1};
shared_ptr<int> sp(&ar[0]);
cout<<*sp<<"n"; // ---- [1]
ar[0] = 10;
cout<<*sp<<"n"; // ---- [2]
ar.clear();
cout<< sp.use_count()<<"n";
cout<<*sp<<endl; // ---- [3]
输出1
10
1
10
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- 如何防止clang格式在流运算符调用之间添加换行符<<
- <<操作员在下面的行中工作
- EASTL矢量<向量<int>>连续的
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- 为什么将此对向量&lt; map&lt; int,int&gt;&gt;中的地图进行更新.失败
- C :对矢量进行排序&lt; struct&gt;(结构有2个整数)基于结构的整数之一
- 明确的专业化“ CheckIntmap&lt;&gt;”实例化
- 什么是模板&lt;&gt;inline bla bla
- 编辑C Qlist&lt; object*&gt; gt;QML代码和一些QML警告中的模型
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误,包括&lt; ctype&gt;在原子上使用C 11
- std::vector<;uint8_t>;当C++11/14启用时,手动复制而不是调用memcpy
- 如何加入向量&lt; int&gt;到C 中的单个INT
- 是std :: set&lt; std :: future&gt;不可能存在
- 是numeric_limits&lt; int&gt; :: is_modulo从逻辑上矛盾
- opencv 2.4.7在iOS错误背景_segm.hpp #include&lt; list&gt;未找到
- 在修改列表后,std :: list&lt; t&gt; :: end()的值是否会更改
- ///<评论></评论>在Visual Studio中