2013-11-25 2 views
1

Эта программа выходит из строя, и я не могу найти никаких нелегальных действий относительно получения содержимого массива и указателя перемещения. Что не так?Перемещение указателя в массиве

#include <iostream> 
#include <stdint.h> 
using namespace std; 


int main(int argc, char ** argv) { 


    int * p = new int [20]; 
    for(int i=0 ; i<20 ;i++) 
     { 
      p[i]=i; 
     } 

    for(int i=0 ; i<20 ;i++) 
     { 
      printf("%d ",*p); 
      p++; 
     } 


    delete [] p; 

    return 0; 
} 
+1

Вопрос: Почему вы используете 'новый' в первую очередь? Вы получаете много дополнительных возможностей, чтобы получить в значительной степени результат, который вы получите, просто сделав '' 'массив /' std :: vector'/'std :: array' local для' main'. Вы получили много советов о том, как свести «новый»/'delete' от сбоя, но никто не указывает, что вы не должны использовать их для начала (и даже если вам нужны« новые »возможности , вы должны смотреть на 'make_shared' и' make_unique' вместо прямого использования 'new'). –

+0

@JerryCoffin позвольте мне ответить на это - в основном потому, что большинство книг, ресурсов, курсов C++ (даже университетских) по-прежнему предпочитают показывать, как реализовать связанный список на C, а затем скомпилировать его с помощью компилятора C++. Люди все еще учат других людей чувствовать себя комфортно внутри «C гетто» (как назвал его Бартош Милевски). –

ответ

6

Вы изменить свой p указатель, а затем вы пытаетесь удалить память после первоначальной выделенной памяти:

delete [] p; 

Сохраните исходный указатель на какой-то временный указатель итератора и увеличить его , а не оригинал:

int *t = p; 
    for(int i=0 ; i<20 ;i++) 
    { 
     printf("%d ",*t); 
     t++; 
    } 
2

Вы удаляете указатель, указывающий на следующий элемент после блока памяти.

2

Сохраните стартовый указатель массива в другом указателе и удалите этот старый указатель на конце.

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