2015-10-23 2 views
0

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

#include "string" 
#include <iostream> 
using namespace std; 
class Test 
{ 
public: 
    void test(int *a) { 
     if (a == 0) 
     { 
      a = new int[10]; 
      bool a_is_null = (a == 0); 
      cout << "in class member function, after allocated, a is null or not?:" << a_is_null << endl; 
     } 
    }; 
}; 
int main() { 
    int *a = 0; 

    bool a_is_null = (a == 0); 
    cout << "in main function, before allocated, a is null or not?:" << a_is_null << endl; 

    Test t; 
    t.test(a); 

    a_is_null = (a == 0); 
    cout << "in main function, after allocated, a is null or not?:" << a_is_null << endl; 

    delete[] a; 
    cin; 
} 

This is the conducting result.

Может кто-нибудь сказать мне, почему?

Выполняет ли функция тестирования уничтожение памяти new int[10] при ее выходе? и так, чтобы после этого указатель a оставался равным нулю.

+2

«C++ выделяет память для указателя в куче» - нет, где вы получите, что неверную информацию от ? –

+0

Да. Ты прав. Должно быть, память, выделенная оператором 'new', находится в куче –

ответ

2

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

t.test(a); 

Поэтому указатель не изменяется после того, как функция выходов. Передайте его по ссылке, и вы увидите разницу, то есть объявить

void Test::test(int* &a) { ...} 

Live example

+0

Да. Все изменилось в соответствии с вашими советами. Спасибо. –

Смежные вопросы