У меня есть базовый класс (AClass
здесь), который имеет protected
ресурс (str
здесь), которые получают free
-х «d в AClass
деструктора. Производный BClass
имеет чистый виртуальный метод Init
. Производный CClass
реализует Init
, который выделяет некоторую память для защищенного ресурса.C++ чисто виртуальный вопрос управления метод памяти
Valgrind говорит, что у меня есть 3 выделения и 2 освобождения. Честно говоря, я только явно см. 1 alloc и 1 бесплатно, но я соглашусь с тем, что есть некоторые, которых я не вижу (на данный момент, но, пожалуйста, кто-нибудь объяснит). Но почему они не сбалансированный не менее? Имеет ли каждый производный экземпляр свой собственный str
, и он не получает free
'd?
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
class AClass;
class BClass;
class CClass;
class AClass
{
public:
AClass() : str(NULL) {
printf("AClass Constructor with no params.\n");
str = (char *) malloc(5 * sizeof(char));
}
AClass(char *foo) {
printf("AClass Constructor with params, %s.\n", foo);
}
virtual ~AClass() {
printf("AClass Destructor. Getting ready to free %s\n", str);
free(str);
printf("\tfree.\n");
}
protected:
char *str;
};
class BClass : public AClass
{
public:
BClass() {
printf("BClass Constructor with no params.\n");
};
BClass(char *foo) : AClass(foo) {
printf("BClass Constructor with params, %s.\n", foo);
str = foo;
};
virtual void Init() = 0;
virtual ~BClass() {
printf("BClass Destructor.\n");
};
};
class CClass : public BClass
{
public:
CClass() {
printf("CClass Constructor with no params.\n");
};
void Init() {
printf("CClass Init method.\n");
str = (char *) malloc(255 * sizeof(char));
printf("\tmalloc.\n");
snprintf(str, 255 * sizeof(char), "Hello, world.");
};
virtual ~CClass() {
printf("CClass Destructor.\n");
};
};
int main (int argc, char const *argv[])
{
printf("Start.\n");
BClass *x = new CClass();
x->Init();
delete x;
printf("End.\n");
return 0;
}
Вот выход Valgrind.
==6641== Memcheck, a memory error detector
==6641== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==6641== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==6641== Command: ./a.out
==6641==
Start.
AClass Constructor with no params.
BClass Constructor with no params.
CClass Constructor with no params.
CClass Init method.
malloc.
CClass Destructor.
BClass Destructor.
AClass Destructor. Getting ready to free Hello, world.
free.
End.
==6641==
==6641== HEAP SUMMARY:
==6641== in use at exit: 5 bytes in 1 blocks
==6641== total heap usage: 3 allocs, 2 frees, 268 bytes allocated
==6641==
==6641== LEAK SUMMARY:
==6641== definitely lost: 5 bytes in 1 blocks
==6641== indirectly lost: 0 bytes in 0 blocks
==6641== possibly lost: 0 bytes in 0 blocks
==6641== still reachable: 0 bytes in 0 blocks
==6641== suppressed: 0 bytes in 0 blocks
==6641== Rerun with --leak-check=full to see details of leaked memory
==6641==
==6641== For counts of detected and suppressed errors, rerun with: -v
==6641== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 18 from 7)
И что происходит, когда вы включаете опцию '--leak-check = full'? –
вид несвязанного, но есть ли причина, по которой вы используете char * вместо std :: string? – MahlerFive
У вас есть 'malloc' в конструкторе' AClass'. Почему вы не делаете 'printf (" \ tmalloc. \ N ")' для этого 'malloc'? Вот почему вы не можете видеть свой несбалансированный 'malloc' в выводе вашей программы. – AnT