下面的代码真的很危险吗? doSmth返回向量对象,应从cont
(doSmth
)复制该对象,然后将其存储在函数test
的范围内的堆栈中。因此,我相信它只会在从test
返回后才会被删除。从函数返回的栈上的对象破坏
struct MyData
{
double m_i;
};
std::vector<MyData> doSmth()
{
std::vector<MyData> cont(10);
return cont;
}
void test()
{
MyData& oneElement = doSmth()[0];
std::cout << oneElement.m_i << std::endl;
}
然而Valgrind的持不同:
Invalid read of size 8
<line 1 in test function oneElement>
Address 0x101281db8 is 8 bytes inside a block of size 72 free'd
std::vector<BlockInfo, std::allocator<BlockInfo> >::~vector() (stl_vector.h:314)
<line 2 in test function>
难道是我的逻辑或Valgrind的谎言有问题吗?
为什么不只是'std :: vector v = doSmth(); MyData&oneElement = v [0];'? –
betabandido
下面是一个更直观的示例:http://ideone.com/pG1n0。正如你所看到的,在结束这个函数之前,一切都消失了。 – chris
我在标准中找不到这个地方,所以我现在不是100%确定。我不明白为什么valgrind写道“无效的大小为8的读取” –