2015-07-15 5 views
0

Я узнал, как использовать оператор delete для динамических массивов, и я столкнулся с какой-то действительно странной проблемой. Я попробовал два подхода, чтобы написать один и тот же код - один работал, но другой работал. Итак, вот код, я попыталсяОбнаружение кучи в динамическом массиве C++?

Способ 1: -

#include <iostream> 
using namespace std; 

int main() 
{ 

    int *p = new int(2); 

    for(int i =0; i<2;i++) 
    { 
     cin>>p[i]; 

    } 

    for(int i=0; i<2;i++) 
    { 
     cout<<p[i]; 

    } 

     delete[] p; 

    system("pause"); 
} 

// Сообщение об ошибке - Кучи коррупция обнаружена. Может кто-нибудь объяснить мне причину ошибки?

Способ 2: - Использование TYPEDEF

#include <iostream> 
using namespace std; 

typedef int arr[2]; 

int main() 
{ 

    int *p = new arr; 

    for(int i =0; i<2;i++) 
    { 
     cin>>p[i]; 

    } 

    for(int i=0; i<2;i++) 
    { 
     cout<<p[i]; 

    } 

     delete[] p; 

    system("pause"); 
} 

// Изложенный метод отлично работает без ошибок. Я совершенно смущен !!

+1

Вероятная ошибка: http://stackoverflow.com/questions/13797926/what-does-new-int100-do –

ответ

0

в первом примере у вас есть:

int *p = new int(2); 

который инициализирует 1 указатель на значение 2, а не в вашем втором примере, когда у вас есть

new int[2]; 

где вы Фактически вы делаете 2 указателя.

+1

Нет, вы не делаете двух указателей. -1 –

2

Первый случай: вы только создать один Int и присвоив ему значение 2.

Тогда вы лечите его как массив с двумя элементами. Это неопределенное поведение. Вам нужно использовать новый int [2]. Синтаксис delete [] верен.

Ваш второй пример слишком запутан.

+0

: - Спасибо за исправление моей ошибки. Кроме того, я узнал новое слово под названием «Obfuscated» .... Спасибо за это. –

+0

Я рад, что мое предложение больше не запутывает! – Bathsheba

2

Вы называете конструктор один междунар со значением 2 не выделяядва Интс.

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

int *p = new int[ 2 ]; 
2

new int(2) выделяет одинint, который имеет значение 2.

new int[2] выделяет массив дваint с, с неопределенными значениями.

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