Форум программистов, компьютерный форум 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
Карточная игра C++
Решил попробовать сделать игру "дурак" в консоли windows. То есть сперва без имитации "интеллекта" машиной, хотя бы чтобы можно было ходить за обоих игроков и выяснять кто победил. Я не видел листинги таких игр, да и мне, как начинающему трудно читать листинги, думаю этот навык придет с практикой. После нескольких подходов-заходов, пришел к выводу, что организовать программу надо примерно так....
C++ Как работает функция вывода элементов списка?
Ребят, объясните в кратце, как работает функция вывода элементов списка(любая), например такая. и если кто знает, дайте ссылочку(литературу) на расшириное описание списков(стеков и очереди)void print_all(stack* o) { if (o->next!=NULL) { printf("%i ", o->x); print_all(o->next); } else printf("\n");
C++ Реализовать алгоритм, вычисляющий N членов ряда Фибоначчи с i-ого по k-й включительно http://www.cyberforum.ru/cpp-beginners/thread1158431.html
Реализовать алгоритм, вычисляющий N членов ряда Фибоначчи с i-ого по k-й включительно. Вычисления прекращаются досрочно , если сумма вычисленных элементов превысит заранее заданное значение. СИ Вопрос: 1)Правильно ли понял задачу, то есть проверить. 2)Не понял с первыми 2 членами Ряд Фибоначчи 1, 1, 2, 3, 5, 8, и так далее.. как 1 и 1 ? тоесть первую 1 я пишу вручную ... правильно ли это...
C++ Как создаются оконные приложения Всем Привет! Вопрос следующий:Хочу научится писать оконные приложения, с гуи ну и т.д.До этого писал такие с opengl, но возможно ли самому(без помощи opengl) создавать окна,например Windows Forms,и там уже делать что хочу, или обычно в нормальных приложениях это делают через опять же с помощью графических библиотек например? посоветуйте пожалуйста что почитать об этом! подробнее

Показать сообщение отдельно
DrOffset
6918 / 4111 / 939
Регистрация: 30.01.2014
Сообщений: 6,905
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);
}
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru