2015-08-02 4 views
4

Выпуском:Valgrind Ошибка: используются при выходе: 72,704 байт C++ инициализация Списка странности с полукоксом *

У меня странный вопрос, который я не ожидал. У меня есть класс с именем ответы и в заголовке заключается в следующем:

class Answer 
{ 
    char* aText; 
    bool b_correct; 
public: 
    Answer():aText(0){;} //default constructor 
} 

Основной (тестирование) код драйвера заключается в следующем:

int main(void) 
{ 

    static const unsigned int MAX_ANSWERS = 5; 
    Answer answers[MAX_ANSWERS]; 
} 

The (неожиданный) странность Я получаю то, что есть распределение происходит, и я еще не использовал нигде в моем коде. Я предполагаю, что char * вызывает это в списке инициализации.

Я использую valgrind для проверки своего кода, и я получаю 11 распределений и 10 бесплатных. Когда я удаляю инициализатор :aText(0), дополнительное выделение уходит.

Получаю, что это плохо сконструированный код. Я следую схеме курса, чтобы узнать, как писать на C++. Может ли кто-нибудь помочь мне понять, как распределена память или что происходит во время списка инициализации, чтобы вызвать вызов нового?

Я знаю, что ошибка исходит из показанного кода. Я знаю, что дополнительный alloc происходит. Когда я компилирую и запускаю только этот код.

Valgrind Выход:

==12598== Memcheck, a memory error detector 
==12598== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==12598== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info 
==12598== Command: ./Answers 
==12598== 
==12598== 
==12598== HEAP SUMMARY: 
==12598==  in use at exit: 72,704 bytes in 1 blocks 
==12598== total heap usage: 1 allocs, 0 frees, 72,704 bytes allocated 
==12598== 
==12598== LEAK SUMMARY: 
==12598== definitely lost: 0 bytes in 0 blocks 
==12598== indirectly lost: 0 bytes in 0 blocks 
==12598==  possibly lost: 0 bytes in 0 blocks 
==12598== still reachable: 72,704 bytes in 1 blocks 
==12598==   suppressed: 0 bytes in 0 blocks 
==12598== Rerun with --leak-check=full to see details of leaked memory 
==12598== 
==12598== For counts of detected and suppressed errors, rerun with: -v 
==12598== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

Информация о платформе:

Fedora 22

gcc.x86_64 5.1.1-4.fc22

valgrind.x86_64 1: 3.10.1-13.fc22

codeblocks.x86_64 13.12-14.fc22

+1

Избавиться от '...' и опубликовать полный класс, который показывает, что вы наблюдаете. Вы потенциально скрываете код за этими '...', который вызывает распределение. – PaulMcKenzie

+0

Почему вы говорите, что есть распределения? Из-за valgrind? Кроме того, хорошо написанный код C++ не будет содержать никаких явных вызовов 'new', но будет иметь много автоматических распределений за кулисами. Не делайте ошибку, думая, что писать C++ о вызове 'new' и' delete'. –

+0

Я не хотел публиковать код, который не был важен для проблемы. Я создал перерывы в моем коде, и это все, что работает для меня, чтобы получить выделение ... и да, valgrind сказал, что это произошло. Это проблема с valgrind? – user2470057

ответ

7

Это известная ошибка GCC 5.1, а не ошибка valgrind.

Подробности здесь: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64535

Возможные обходные пути: Понизить GCC на более раннюю версию или ждать Valgrind, чтобы обновить исправление этой ошибки. Оба решения разрабатываются соответствующими сообществами.

+0

Какие-нибудь разработки? –

+2

Ошибка все еще присутствует в 5.4 –

+0

Так ли это настоящая утечка? Или Valgrind неправильно сообщает что-то? –