2011-02-09 15 views
0

Подходит ли следующий код?Инициализация указателя в классах

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     *Bar = 123; 
    } 
} 

Другими словами, будет Bar на самом деле указывают на реальное пространство памяти перед присваивается значение этого пространства в конструкторе? Или у меня есть что-то вроде этого:

class Foo() 
{ 
    int* Bar; 

    public: 

    Foo() 
    { 
     Bar = new int[1]; 
     *Bar = 123; 
    } 

    ~Foo() 
    { 
     delete[] Bar; 
    } 
} 
+0

Вы пытаетесь назначить адрес памяти вручную? В любом случае, я не эксперт, но я уверен, что вы никогда не говорите «новый int» или какой-либо другой примитив. – jakev

+0

Fitst ошибается. вам нужно это новое. –

ответ

2

Вам необходимо назначить память, как и во втором примере. Если вы попытаетесь запустить код в первом примере, это скорее всего произойдет с ошибкой нарушения прав доступа, поскольку вы пытаетесь записать целое число 123 в любой части памяти, на которую указывает значение указателя неинициализированного Bar.

+0

Приведено в качестве примера. – Maxpm

+0

Хорошо, отредактировал мой ответ, чтобы это отразить. – Coincoin

2

Если вы не хотите динамический массив, то

Bar = new int; 
*Bar = 123; 

достаточно! И тогда вы, чтобы сделать это:

delete Bar; //not delete[] Bar; 

-

Однако, если вы хотите динамический массив (с помощью которой вы можете хранить несколько значений), то сделать это:

Bar = new int[5]; 
Bar[0] = 123; 
Bar[3] = 788; 
//etc 

Тогда delete[] Bar - это правильный способ удаления выделенной памяти!

1

Бар на самом деле указывает на реальное пространство памяти, прежде чем значение присваивается этому пространству в конструкторе?

№ Указатель - это просто «простая» переменная. Он не будет выделять вам какую-либо память. Кроме того, если вы не инициализируете его, он укажет на произвольное и в основном непредсказуемое расположение в памяти.

Вообще говоря, вы должны либо инициализировать его NULL (или 0 в зависимости от предпочтения), либо иначе в выделенную память (например, вы делаете Bar = new int).

1

В первом примере -

int* Bar; 

Указатели указывает на объект. Задача компилятора заключается в том, чтобы назначить память (т. Е. 4 байта) для целочисленного указателя Bar для хранения адреса целочисленной переменной. Однако, чтобы указать место, которое оно указывает, необходимо указать для разыменования.

Это больше похоже на то, что банк дает вам счет. Просто наличие банковского счета не означает, что вы можете получать деньги из банкомата. У вашей учетной записи должны быть деньги, чтобы иметь возможность рисовать. Транзакция терпит неудачу, если у вас нет денег, а в парадигме программирования поведение не определено. Итак, ваш первый пример поведения не определен. Если моя аналогия слишком неловкая, я сожалею.

Во втором примере -

int* Bar = new int[1] ; // Here [1] is unnecessary as your Bar points to a single integer memory location. 

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

*Bar = 10; 
*Bar *= 10; 

Во втором примере, так как вы управляете ресурсами, поэтому его ваша ответственность, чтобы вернуть источники обратно в свободной памяти.

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