2013-03-09 1 views
1

У меня есть этот пример кода для строки вектора:Строка вектор все еще достижимы

vector<string> strings; 
strings.push_back(argv[0]); 
cout << strings[0] << endl; 
strings.clear(); 

exit(0); 

Но Valgrind говорит:

==26012== HEAP SUMMARY: 
==26012==  in use at exit: 8 bytes in 1 blocks 
==26012== total heap usage: 2 allocs, 1 frees, 41 bytes allocated 
==26012== 
==26012== 8 bytes in 1 blocks are still reachable in loss record 1 of 1 
==26012== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==26012== by 0x401DCF: __gnu_cxx::new_allocator<std::string>::allocate(unsigned long, void const*) (new_allocator.h:92) 
==26012== by 0x401BD8: std::_Vector_base<std::string, std::allocator<std::string> >::_M_allocate(unsigned long) (in /home/nich/IPK/2/client) 
==26012== by 0x401706: std::vector<std::string, std::allocator<std::string> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string*, std::vector<std::string, std::allocator<std::string> > >, std::string const&) (vector.tcc:327) 
==26012== by 0x401421: std::vector<std::string, std::allocator<std::string> >::push_back(std::string const&) (stl_vector.h:834) 
==26012== by 0x401102: main (client.cc:130) 
==26012== 
==26012== LEAK SUMMARY: 
==26012== definitely lost: 0 bytes in 0 blocks 
==26012== indirectly lost: 0 bytes in 0 blocks 
==26012==  possibly lost: 0 bytes in 0 blocks 
==26012== still reachable: 8 bytes in 1 blocks 
==26012==   suppressed: 0 bytes in 0 blocks 

Что я делаю неправильно? String :: clear метод должен вызвать деструктор на строку не должен? В любом случае я попробовал альтернативный путь с указателями.

vector<string*> strings; 
strings.push_back(new string(argv[0])); 
cout << *(strings[0]) << endl; 
delete strings[0]; 
strings.clear(); 

exit(0); 

Valgrind:

==10177== HEAP SUMMARY: 
==10177==  in use at exit: 8 bytes in 1 blocks 
==10177== total heap usage: 3 allocs, 2 frees, 49 bytes allocated 
==10177== 
==10177== 8 bytes in 1 blocks are still reachable in loss record 1 of 1 
==10177== at 0x4C2B1C7: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==10177== by 0x401CF9: __gnu_cxx::new_allocator<std::string*>::allocate(unsigned long, void const*) (new_allocator.h:92) 
==10177== by 0x401B5C: std::_Vector_base<std::string*, std::allocator<std::string*> >::_M_allocate(unsigned long) (in /home/nich/IPK/2/client) 
==10177== by 0x4016EA: std::vector<std::string*, std::allocator<std::string*> >::_M_insert_aux(__gnu_cxx::__normal_iterator<std::string**, std::vector<std::string*, std::allocator<std::string*> > >, std::string* const&) (vector.tcc:327) 
==10177== by 0x4013F1: std::vector<std::string*, std::allocator<std::string*> >::push_back(std::string* const&) (stl_vector.h:834) 
==10177== by 0x4010C4: main (client.cc:130) 
==10177== 
==10177== LEAK SUMMARY: 
==10177== definitely lost: 0 bytes in 0 blocks 
==10177== indirectly lost: 0 bytes in 0 blocks 
==10177==  possibly lost: 0 bytes in 0 blocks 
==10177== still reachable: 8 bytes in 1 blocks 
==10177==   suppressed: 0 bytes in 0 blocks 

Но все же проблема. Не могли бы вы рассказать мне, как я должен анализировать аргументы из * argv [] в векторную строку без байтов достижимой цели?

+2

Почему вы используете 'exit()'? Поместите свой код в область действия, например. '{..}' и вернуться из main вместо вызова 'exit()'. Тогда ваш чек будет иметь больше смысла. Во всяком случае, вы поступаете правильно :) – Drakosha

+0

Я буду более о ней говорить: когда вы используете C++, лучше забыть, что 'exit' существует - по крайней мере, как правило, вы не должны его использовать в C++ вообще. –

+0

Право. 'exit' обходит вызовы деструктора, в то время как многие классы в значительной степени полагаются на деструкторы, которые фактически вызываются. В любом случае, если у вас есть много других переменных в вашей программе в функциях вызывающего абонента, которые вы не можете поместить в фигурные скобки, один взлом - это просто выбросить ошибку и никогда не поймать ее. Но это взломать, более рекомендуется предоставить пользователю некоторые указания на то, что пошло не так. – Samee

ответ

7

Вызов strings.clear() является опорой только вектором, но вектор сам по-прежнему занимает память. Статически создавая это следующим образом:

vector<string> strings; 

она все равно будет на память, пока функция не выходит из области видимости (и так как вы назвали exit в то время как в функции, она была еще в рамках, когда программа закончилась).

2

Я думаю, что «просочившиеся» 8 байтов относятся к контейнеру STL. Когда вы выйдете, std :: vector не будет разрушен. Попробуйте следующее:

{ 
    vector<string> strings; 
    strings.push_back(argv[0]); 
    cout << strings[0] << endl; 
    strings.clear(); 
} 
exit(0); 
Смежные вопросы