2012-05-07 8 views
3

Когда я пытаюсь сделать следующее, я получаю сообщение о том, что пытаюсь читать или записывать в защищенную память.Объем новой памяти в C++

void func1(int * ptr) { 
    int *ptr_b = new int[5]; 
    ptr = ptr_b; 
} 

void main() { 
    int *ptr_a; 
    func1(ptr_a); 
    delete [] ptr_a; 
} 

Это законный?

+0

Не используйте 'void main()': http://www2.research.att.com/~bs/bs_faq2.html#void-main. Вы должны передать указатель по ссылке, чтобы начать с этого. – chris

+0

[void main] (http://stackoverflow.com/q/3652182/14065) –

ответ

9

Нет. Вы делаете обычную ошибку начинающего. Вы не помните, что указатели - это просто переменные, которые передаются по значению, если вы не попросите ссылку или указатель на них. Измените подпись вашей функции на void func1(int *& ptr)

7

Изменить свою подпись:

void func1(int *& ptr) 

можно передать указатель на значение, так что снаружи ptr не переодеваться. Так что, как делать

int main() { // <--- main returns int 
    int *ptr_a; 
    delete [] ptr_a; 
} 

, который является незаконным, так как ptr_a не инициализирован.

+0

Я имею в виду, что, поскольку 'void main()' не является законным C++, мы должны приводить примеры * с помощью * legal C++. См. Ссылку в вопросе комментариев, что я имею в виду. – chris

4

Вы передали указатель на значение. Это означает, что указатель, с которым работает эта функция, является локальной копией указателя вызывающего. И поэтому значение, которое вы назначаете в функции, не может видеть вызывающий.

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

void func1(int* &ptr) 

Или, возможно, рассмотреть возможность возвращения вновь выделенный указатель:

int* func1() 
{ 
    return new int[5]; 
} 

Я предпочитаю последний подход.

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