У меня есть этот пример кода для строки вектора:Строка вектор все еще достижимы
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 [] в векторную строку без байтов достижимой цели?
Почему вы используете 'exit()'? Поместите свой код в область действия, например. '{..}' и вернуться из main вместо вызова 'exit()'. Тогда ваш чек будет иметь больше смысла. Во всяком случае, вы поступаете правильно :) – Drakosha
Я буду более о ней говорить: когда вы используете C++, лучше забыть, что 'exit' существует - по крайней мере, как правило, вы не должны его использовать в C++ вообще. –
Право. 'exit' обходит вызовы деструктора, в то время как многие классы в значительной степени полагаются на деструкторы, которые фактически вызываются. В любом случае, если у вас есть много других переменных в вашей программе в функциях вызывающего абонента, которые вы не можете поместить в фигурные скобки, один взлом - это просто выбросить ошибку и никогда не поймать ее. Но это взломать, более рекомендуется предоставить пользователю некоторые указания на то, что пошло не так. – Samee