是这样子的
这样子的代码居然能够正常运行
#include
#include
using namespace std;
vector<int>::iterator fun(vector<int> t){
return t.begin()+2;//返回一个局部对象的迭代器
}
int main(){
vector<int> test = {1,2,3,4};
auto p1 = fun(test);
cout << *p1 << endl;//对之前局部的迭代器进行解引用,应该是不行的
}
// 但是能够正常的输出3
不清楚为什么
使用内存检测工具检查了一下
valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./test.out
==4677== Memcheck, a memory error detector
==4677== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==4677== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==4677== Command: ./test.out
==4677==
==4677== Invalid read of size 4
==4677== at 0x400BA8: main (t.cpp:13)
==4677== Address 0x5ab4cd8 is 8 bytes inside a block of size 16 free'd
==4677== at 0x4C2F160: operator delete(void*) (vg_replace_malloc.c:576)
==4677== by 0x4016AB: __gnu_cxx::new_allocator ::deallocate(int*, unsigned long) (new_allocator.h:110)
==4677== by 0x4015B8: std::allocator_traits::allocator >::deallocate(std::allocator& , int*, unsigned long) (alloc_traits.h:517)
==4677== by 0x4013A5: std::_Vector_base, std::allocator >::_M_deallocate(int*, unsigned long) (stl_vector.h:178)
==4677== by 0x401094: std::_Vector_base, std::allocator >::~_Vector_base() (stl_vector.h:160)
==4677== by 0x400EB2: std::vector, std::allocator >::~vector() (stl_vector.h:425)
==4677== by 0x400B9B: main (t.cpp:12)
==4677== Block was alloc'd at
==4677== at 0x4C2E1D6: operator new(unsigned long) (vg_replace_malloc.c:334)
==4677== by 0x4016EF: __gnu_cxx::new_allocator ::allocate(unsigned long, void const*) (new_allocator.h:104)
==4677== by 0x40160D: std::allocator_traits::allocator >::allocate(std::allocator& , unsigned long) (alloc_traits.h:491)
==4677== by 0x401435: std::_Vector_base, std::allocator >::_M_allocate(unsigned long) (stl_vector.h:170)
==4677== by 0x401508: std::_Vector_base, std::allocator >::_M_create_storage(unsigned long) (stl_vector.h:185)
==4677== by 0x40122C: std::_Vector_base, std::allocator >::_Vector_base(unsigned long, std::allocator const&) (stl_vector.h:136)
==4677== by 0x400F19: std::vector, std::allocator >::vector(std::vector, std::allocator > const&) (stl_vector.h:320)
==4677== by 0x400B7F: main (t.cpp:12)
==4677==
3
==4677==
==4677== HEAP SUMMARY:
==4677== in use at exit: 72,704 bytes in 1 blocks
==4677== total heap usage: 4 allocs, 3 frees, 73,760 bytes allocated
==4677==
==4677== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==4677== at 0x4C2DBB6: malloc (vg_replace_malloc.c:299)
==4677== by 0x4EC2EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==4677== by 0x40104E9: call_init.part.0 (dl-init.c:72)
==4677== by 0x40105FA: call_init (dl-init.c:30)
==4677== by 0x40105FA: _dl_init (dl-init.c:120)
==4677== by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==4677==
==4677== LEAK SUMMARY:
==4677== definitely lost: 0 bytes in 0 blocks
==4677== indirectly lost: 0 bytes in 0 blocks
==4677== possibly lost: 0 bytes in 0 blocks
==4677== still reachable: 72,704 bytes in 1 blocks
==4677== suppressed: 0 bytes in 0 blocks
==4677==
==4677== For counts of detected and suppressed errors, rerun with: -v
==4677== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
后来拿了另外一个代码进行测试
#include
#include
using namespace std;
vector<int>::iterator fun(vector<int>& t){//修改了,变成传引用
return t.begin()+2;
}
int main(){
vector<int> test = {1,2,3,4};
auto p1 = fun(test);
cout << *p1 << endl;
}
这个是肯定没问题的
同样的内存检测工具进行
valgrind --tool=memcheck --leak-check=full --show-reachable=yes ./test.out
==4743== Memcheck, a memory error detector
==4743== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==4743== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==4743== Command: ./test.out
==4743==
3
==4743==
==4743== HEAP SUMMARY:
==4743== in use at exit: 72,704 bytes in 1 blocks
==4743== total heap usage: 3 allocs, 2 frees, 73,744 bytes allocated
==4743==
==4743== 72,704 bytes in 1 blocks are still reachable in loss record 1 of 1
==4743== at 0x4C2DBB6: malloc (vg_replace_malloc.c:299)
==4743== by 0x4EC2EFF: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21)
==4743== by 0x40104E9: call_init.part.0 (dl-init.c:72)
==4743== by 0x40105FA: call_init (dl-init.c:30)
==4743== by 0x40105FA: _dl_init (dl-init.c:120)
==4743== by 0x4000CF9: ??? (in /lib/x86_64-linux-gnu/ld-2.23.so)
==4743==
==4743== LEAK SUMMARY:
==4743== definitely lost: 0 bytes in 0 blocks
==4743== indirectly lost: 0 bytes in 0 blocks
==4743== possibly lost: 0 bytes in 0 blocks
==4743== still reachable: 72,704 bytes in 1 blocks
==4743== suppressed: 0 bytes in 0 blocks
==4743==
==4743== For counts of detected and suppressed errors, rerun with: -v
==4743== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
同样能够正常运行
不过内存检测工具还是检查出问题来了
问题:
不知道为什么之前那个代码能够正常运作