2016-06-28 2 views
0

Если я определяю настраиваемый деструктор, должен ли я удалить каждую переменную вручную?Написание C++ Destructor

Память, выделенная malloc, должна быть free d в деструкторе. Как насчет указателя на память, выделенного malloc, и int?
хиджры:

#ifndef A_H 
#define A_H 
#include <stdlib.h> 
#include <iostream> 
#include <stdint.h> 
using namespace std; 

class A{ 
    public: 
    uint32_t x; 
    uint32_t* ar_y; 
    A(void); 
    ~A(void); 
}; 
#endif 

a.cpp:

#include "a.h" 
A::A(void){ 
    x = 0; 
    ar_y = (uint32_t*)(malloc(4)); 
} 
A::~A(void){ 
    // free the memory allocated by malloc 
    free(ar_y); 
    //Is it ok to do nothing for int* y and int x? 
} 

test.cpp:

#include "a.h" 
int f(void){ 
    A objA; 
    //cout << objA.x << endl; 
    //Upon exiting the function 
    //destructor of A is called. 
} 
int main(void){ 
    uint32_t i; 
    // see if memory usage go crazy. 
    for (i = 0; i < 10000000000; i++) f(); 
} 

Результат теста:

использование памяти не поднималось бешено.

+0

delete [] y освободил выделенную память для y –

+1

@Bafforasta были 'new' использованы, что было бы действительно действительно. – WhozCraig

+0

@WhozCraig Я просто блуждал, почему он не –

ответ

3

Вам ничего не нужно делать для x. Вам необходимо позаботиться об освобождении памяти, на которую указывает ar_y.

Для получения дополнительной информации о том, что вам нужно делать, когда вы выделяете память для переменных-членов в классе, см. What is The Rule of Three?.

Поскольку вы находитесь на земле C++, предпочитаете использовать операторы new и delete вместо malloc и free.

+0

Если мне нужно выделить память с 32-разрядным выравниванием в Linux ... что такое принятый способ сделать это на C++? – rxu

+0

@rxu, см. [Распределение динамической выровненной памяти в C++ 11] (http://stackoverflow.com/questions/6973995/dynamic-aligned-memory-allocation-in-c11). –

+0

так, я думаю, что означает. 1. Напишите слой абстракции. или 2. используйте указатель для выделения выровненной памяти, когда производительность очень важна. – rxu