singlepost

Работа с динамическим массивом (new int[n]) C++ << На главную или назад  

создал массив диамический
a* data=new int[6];
поработал с ним, и нужно увеличить размерность до 8
как это сделать?

38 ответов в теме “Работа с динамическим массивом (new int[n]) C++”

  1. 36
    Пашка Джиоев ответил:

    Есть такой шаблон безопасного программирования //ru.wikipedia.org/wiki/Получение_ресурса_есть_... (RAII)
    Если уж используешь new то лучше оборачивать указатель в auto_ptr.

  2. 35
    Александр Лищенер ответил:

    пачиму?

  3. 34
    Пашка Джиоев ответил:

    Вообще лучше стараться избегать явных вызовов оператора new и delete, вместо этого использовать локальные переменные.

  4. 33
    Денис Федоренко ответил:

    #23

    > //изучаю сейчас классы, поэтому много вопросов

    Изучи сначала основы C/C++, чтобы тупых вопросов не задавать.

    > "cannot add two pointers"

    Английский тоже изучи – полезно.

  5. 32
    Дмитрий Ашкадов ответил:

    Ну, да.. так можно. Но проще просто
    qwe object(1); //статически на стеке

    Кст. конструктор у тебя закрытый, так что из мейна ругаться компилятор должен

  6. 31
    ответил:

    там паблик был, не ругается

  7. 30
    Дмитрий Мамонтов ответил:

    Дмитрий Ашкадов,"гетерогенный массив" уже не в счет? Или вы будете его полиморфизмом реализовывать? Правда, интересно.
    Медведь , скорее всего вы написали в операторе + строку вида
    int+=o.int (o – другой объект). Я сомневаюсь, в том что data должен был быть указателем, но напишите нечто в вида
    int tmp=*data;
    delete data;
    data=new int(tmp+*(o.data));
    Потому что вы складывали два указателя.

  8. 29
    ответил:

    денис, я понимаю что Вы здесь умнее, но я прекрасно понимаю что это значит, я не знаю как это исправить

  9. 28
    Дмитрий Ашкадов ответил:

    qwe *obj1 = new qwe(1);
    qwe *obj2 = new qwe(2);
    qwe obj3 = *obj1 + *obj2;

  10. 27
    Дмитрий Мамонтов ответил:

    #30, Прошу прощения, пишу не то. Вот верный код:
    return qwe(*data+*(o.data));

  11. 26
    Денис Федоренко ответил:

    Медведь, если бы вы потратили хотя бы 5 минут времени на то, чтобы узнать, что такое объект и что такое указатель на объект, то не получили бы ни ошибки, ни вопроса.

    > class * myclass = new myclass(0)

    Это создание указателя на объект + инициализация самого объекта

    > class myclass(0)

    А это создание и инициализация объекта.

    Если ты перегружаешь оператор +, то это будет применяться исключительно к самим объектам, но не к указателям, поэтому складывать надо так:

    *myclass1 + *myclass2 а не myclass1 + myclass2

    P.S. Такую тему на две страницы раздуть – это ж умудриться надо.

  12. 25
    Александр Лищенер ответил:

    а. ну да, я безбожно туплю.

    Леонид, а зачем конструктор? недостаточно просто размера этого чего-то?

  13. 24
    Дмитрий Мамонтов ответил:

    #18, Нам нужен именно указатель на неведомо что. void * как раз для этого.
    #19. Я принимаю sizeof(char)==1, но возможны, и кажется есть реализации компилятора, где char может не занимать 1 байт, а больше. А еще возможен typedef, который и вовсе испортит работу.

  14. 23
    Дмитрий Ашкадов ответил:

    Так, все обладает этим конструктором ))
    int a(5); //например,

  15. 22
    ответил:

    проблема по сабжу решена способом, который дал Дмитрий HiddenSeeker Мамонтов

    еще небольшой вопрос.
    создаю элемент класса с помощью new

    class * myclass = new myclass(0);

    правильно ли делаю? нужен ли там new? нужен ли там указатель?
    если с указателем то все отлично работает кроме переопределения оператора +, он с ошибкой вылетает "cannot add two pointers"

    //изучаю сейчас классы, поэтому много вопросов

  16. 21
    Дмитрий Ашкадов ответил:

    #21, ну если так, ноочень сомневаюсь, что понадобится этот указатель на неизвестно что…

  17. 20
    Дмитрий Ашкадов ответил:

    class * myclass = new myclass(0); – что это такое?

  18. 19
    ответил:

    немного непонятно написал)
    у меня есть класс определенный

    class qwe {
    public:
    data* int;
    qwe(int n);
    ~qwe();
    }

    в main:

    qwe * myclass = new qwe(1);

  19. 18
    Дмитрий Мамонтов ответил:

    Александр [MySchizophrenia] Лищенер, если не ошибаюсь, malloc принимает размер в байтах.
    Навскидку:
    int bytes=500;
    void * p=(void*)(new char[bytes]);
    Хоть и платформозависимо.

  20. 17
    Леонид Максимов ответил:

    2 Александр Лищенер
    для new нужно что-то, обладающее конструктором.

  21. 16
    Дмитрий Ашкадов ответил:

    Память можно выделять только блоками (минимум по байтам, а то и по словам). Так что выделение , например, 10 бит сводится к выделению одного int'а

  22. 15
    Дмитрий Ашкадов ответил:

    В C++ по сути void * уже не нужен.
    Просто
    char *p = new char[500];

  23. 14
    Дмитрий Ашкадов ответил:

    #15, почему это платформозависимо?

  24. 13
    Дмитрий Мамонтов ответил:

    Дмитрий Ашкадов, а причем здесь оператор new? Человек с целыми числами работает, и вообще с integtal types.И codestyle здесь ни при чем.

  25. 12
    Александр Лищенер ответил:

    №10, как выделить кусок памяти на n бит? или я безбожно туплю, или для new нужна определенность?

  26. 11
    Леонид Максимов ответил:

    засовывайте указатель на неизвестно что (можете добавить поле, определяющее, как от этого неизвестно чего избавляться при необходимости). в чем проблема-то?

  27. 10
    Дмитрий Ашкадов ответил:

    Объясняю… Если вы делаете проект, в котором перегружается оператор ::new, то….. Вообщем, я думаю, вы сами поняли, почему нельзя malloc и прочую C-неговскую херню. Использование malloc – уже не C++Codestyle!

  28. 9
    Дмитрий Ашкадов ответил:

    #9, да, в чем суть, в чем проблема?

  29. 8
    Дмитрий Мамонтов ответил:

    b * tmp=new int[8];
    memcpy(b,a,6*sizeof(int) );
    delete[] a;
    a=b;

    А вообще malloc и free лучше для таких простых примеров.

  30. 7
    Дмитрий Ашкадов ответил:

    int *old_arr = new int[6];
    ….
    int *new_arr = new int[8];
    for (int *p = old_arr, *e = p + 6, *n = new_arr; p < e; ++p, ++n)
    *n = *p;
    delete[] old_arr;

  31. 6
    ответил:

    меня уже в этой группе так ругали за маллок)

  32. 5
    Дмитрий Ашкадов ответил:

    НИКОГДА не используй malloc и freeв C++!!!

  33. 4
    ответил:

    спасибо сейчас попробую

  34. 3
    Дмитрий Мамонтов ответил:

    Ну, это зависит от того, что вы хотите получить. Если простенький динамический массив чисел – то он сойдет. Если сложный обобщенный контейнер – само собой нет.

  35. 2
    Дмитрий Мамонтов ответил:

    Дмитрий Ашкадов, и что мешает использовать malloc и free?

  36. 1
    Александр Лищенер ответил:

    Дмитрий, представьте себе не-шаблонный связный список, в который надо что-то сунуть, неизвестно что.
    предложите реализацию без malloc?
    просто интересно, на самом деле)

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.