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

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

Восстановить пароль Регистрация
 
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
26.04.2014, 23:29     Динамическая память и конструктор класса #1
Подскажите, почему
C++
1
Marshroute *objects2 = new Marshroute[n + 1](for_loop);
компилятор ругается на (for_loop), если я хочу запустить конструктор не по умолчанию.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,852
Записей в блоге: 2
Завершенные тесты: 1
26.04.2014, 23:31     Динамическая память и конструктор класса #2
Цитата Сообщение от lion_wine Посмотреть сообщение
если я хочу запустить конструктор не по умолчанию.
синтаксис new-expression не поддерживает создание массива объектов конструкторами с параметрами
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
26.04.2014, 23:38  [ТС]     Динамическая память и конструктор класса #3
если убрать [n+1] все компилируется, например, для создания временного контейнера (уже опробовано). А как можно, тогда обойти, не запуская конструктор по умолчанию?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11812 / 6791 / 768
Регистрация: 27.09.2012
Сообщений: 16,852
Записей в блоге: 2
Завершенные тесты: 1
27.04.2014, 00:02     Динамическая память и конструктор класса #4
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
#include <iostream>
class A{
public:
  A() {
    std::cout << "call A()" << std::endl ;
  }
  A(int x) {
    std::cout << "call A(" << x << ")" << std::endl ;
  }
  ~A() {
    std::cout << "call ~A" << std::endl ;
  }
} ;
 
 
A * allocateA ( size_t size ) {
  A * buffer = static_cast<A*> ( operator new (sizeof(A) * size) ) ;
  for ( size_t i = 0 ; i < size ; ++i ) {
    new (buffer+i) A ( i ) ;
  }
  return buffer ;
}
 
void deallocateA ( A * buffer , size_t size ) {
  for ( size_t i = 0 ; i < size ; ++i ) {
    buffer[i].~A() ;
  }
  operator delete ( buffer ) ;
}
 
int main( int argc, char ** argv )
{
  size_t size = 5 ;
  A * a = allocateA ( size ) ;
  deallocateA ( a , size ) ;
}
DrOffset
6423 / 3797 / 878
Регистрация: 30.01.2014
Сообщений: 6,585
27.04.2014, 00:09     Динамическая память и конструктор класса #5
Цитата Сообщение от 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);
}
lion_wine
8 / 8 / 0
Регистрация: 08.03.2014
Сообщений: 101
27.04.2014, 00:20  [ТС]     Динамическая память и конструктор класса #6
спасибо, исчерпывающе)
Yandex
Объявления
27.04.2014, 00:20     Динамическая память и конструктор класса
Ответ Создать тему
Опции темы

Текущее время: 12:18. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru