Форум программистов, компьютерный форум CyberForum.ru

Динамическая память и конструктор класса - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Освобождение памяти http://www.cyberforum.ru/cpp-beginners/thread1158457.html
Маленький вопросик, как правильно освобождать память выделенную под vector<...>, деструктором ~vector() или методом clear() ?
C++ Map stl c++ ссылка на неразрешенный внешний символ Уважаемые форумчане, столкнулся с проблемой вставки объекта класса как параметр в контейнер map. Привожу ниже код как пытался сделать. Компилятор использую visual studio 2012. При построении проекта выдает следующие ошибки : 1>Исходный код.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: virtual __thiscall Staff::~Staff(void)" (??1Staff@@UAE@XZ) в функции "public:... http://www.cyberforum.ru/cpp-beginners/thread1158454.html
OpenGL Подключение OpenGL GLUT к Visual Studio 2013
начал изучать OpenGL, скачал библиотеки, но библиотека GLUT не работает, пробовал разные способы из интернета, но ничего не помогает, помогите, очень нужно использую Visual Studio 2013 заранее спасибо
Карточная игра C++
Решил попробовать сделать игру "дурак" в консоли windows. То есть сперва без имитации "интеллекта" машиной, хотя бы чтобы можно было ходить за обоих игроков и выяснять кто победил. Я не видел листинги таких игр, да и мне, как начинающему трудно читать листинги, думаю этот навык придет с практикой. После нескольких подходов-заходов, пришел к выводу, что организовать программу надо примерно так....
C++ Как работает функция вывода элементов списка? http://www.cyberforum.ru/cpp-beginners/thread1158438.html
Ребят, объясните в кратце, как работает функция вывода элементов списка(любая), например такая. и если кто знает, дайте ссылочку(литературу) на расшириное описание списков(стеков и очереди)void print_all(stack* o) { if (o->next!=NULL) { printf("%i ", o->x); print_all(o->next); } else printf("\n");
C++ Реализовать алгоритм, вычисляющий N членов ряда Фибоначчи с i-ого по k-й включительно Реализовать алгоритм, вычисляющий N членов ряда Фибоначчи с i-ого по k-й включительно. Вычисления прекращаются досрочно , если сумма вычисленных элементов превысит заранее заданное значение. СИ Вопрос: 1)Правильно ли понял задачу, то есть проверить. 2)Не понял с первыми 2 членами Ряд Фибоначчи 1, 1, 2, 3, 5, 8, и так далее.. как 1 и 1 ? тоесть первую 1 я пишу вручную ... правильно ли это... подробнее

Показать сообщение отдельно
DrOffset
6459 / 3833 / 885
Регистрация: 30.01.2014
Сообщений: 6,628
27.04.2014, 00:09     Динамическая память и конструктор класса
Цитата Сообщение от lion_wine Посмотреть сообщение
если убрать [n+1] все компилируется, например, для создания временного контейнера (уже опробовано).
Да. Для создания отдельных объектов - работает, для массивов - нет.
Цитата Сообщение от lion_wine Посмотреть сообщение
А как можно, тогда обойти, не запуская конструктор по умолчанию?
Как вариант, использовать вектор:
C++
1
std::vector<Marshroute> objects2(n + 1, Marshroute(for_loop));
В GCC есть расширение, которое позволяет запись из твоего первого поста. Но код потеряет переносимость.

Еще можно определить собственную функцию создания массивов с конструкторами (код С++11):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
template <typename T, typename ...Args>
T * alloc_array(size_t count, Args... args)
{
    if(void * pRaw = std::malloc(sizeof(size_t) + sizeof(T) * count))
    {
        std::memcpy(pRaw, &count, sizeof(size_t));
        T * pArr = reinterpret_cast<T*>(static_cast<char *>(pRaw) + sizeof(size_t));
        for(size_t i = 0; i < count; ++i)
        {
            ::new(pArr + i) T(args...);
        }
        return pArr;
    }
    throw std::bad_alloc();
}
 
template <typename T>
void delete_array(T * pArr)
{
    if(pArr != nullptr)
    {
        void * pRaw  = reinterpret_cast<char*>(pArr) - sizeof(size_t);
        size_t count;
        std::memcpy(&count, pRaw, sizeof(size_t));
        for(int i = count - 1; i >= 0; --i)
        {
            (pArr + i)->~T();
        }
        std::free(pRaw);
    }
}
 
int main(int argc, char *argv[])
{
    Test * p = alloc_array<Test>(1, 5);
 
    delete_array(p);
}
 
Текущее время: 16:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru