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

Как выделить память для класса - C++

Восстановить пароль Регистрация
 
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 15:01     Как выделить память для класса #1
Привет, я пишу библиотеку управления памятью. На данный момент я выделяю память вот так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void * __cdecl MyAlloc(size_t size)
{
    void * p=NULL;
    if( p= malloc(size))//проверяем может ли маллок выделить память
    {
          return p;//возвращаем указатель на начало выделенного фрагмента
    }
     if((p=malloc(size))==NULL)
     {
          throw std::bad_alloc();
          return NULL;
     }
 
}
Вопрос состоит в том, как переделать эту функцию, чтобы она выделяла память для класса без использования sizeof?
C++
1
MyAlloc(sizeof(class))
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
11.05.2010, 18:53     Как выделить память для класса #2
А чем вызвано столь причудливое ограничение?
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 18:59  [ТС]     Как выделить память для класса #3
Моими соображениями, потому как оператор new выделяет для класса память и не нуждается в указании размера для выделения. Я хочу сделать что то похожее, если возможно)
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
11.05.2010, 19:11     Как выделить память для класса #4
Miska, наверное MyAlloc(sizeof(MyClass))... А чем Вам простое
C++
1
2
3
...
MyClass *pMyClass = new MyClass();
...
не угодило?
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:13  [ТС]     Как выделить память для класса #5
easybudda, задание гласит без new, т.к оно не генерирует bad_alloc.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 19:18     Как выделить память для класса #6
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <stdio.h>
#include <stdlib.h>
#define getMem(Type) (Type*) malloc(sizeof(Type))
 
struct Data {
int a;
int b;
int c;
int mas[10];
};
int main(){
 
Data *ptr = getMem(Data);
ptr->a = 20;
ptr->b = 20;
printf("a: %d",ptr->a);
printf("\n");
free(ptr);
 
return 0;
}
Так сойдет.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:20     Как выделить память для класса #7
Цитата Сообщение от Miska Посмотреть сообщение
easybudda, задание гласит без new, т.к оно не генерирует bad_alloc.
Miska, чего ты вы напутали, new согласно стандарту генерирует std::bad_alloc.
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:27  [ТС]     Как выделить память для класса #8
CyBOSSeR, http://support.microsoft.com/kb/167733 - по поводу нью.


Genius Ignat, спасибо, попробую.
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 19:33     Как выделить память для класса #9
Для массива выделить не получиться. надо подкорректировать макрос дополнительным параметром.
Miska: new согласно генерирует исключение.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:36     Как выделить память для класса #10
Miska, вы список IDE для которых это актуально в конце статьи видели?
Там самая новая 2005 года, да и то Express Edition. Руководствоваться нужно стандартом, а не статьями Microsoft.
Ладно, это полбеды, new кроме выделения памяти еще и конструкторы вызывает, как с этим бороться собираетесь?
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 19:46     Как выделить память для класса #11
еще и конструкторы вызывает, как с этим бороться собираетесь
Вот наглядное подтверждение: указатель _ vptr на таблицу виртуальных функций не настраивается.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdlib.h>
using namespace std;
 
 
class MyClass {
public:
    virtual void func(){cout<<"Hello\n";}
 
 
};
 
int main(){
MyClass * ptr =(MyClass*) malloc(sizeof(MyClass));
ptr->func();
 
 
free(ptr);
return 0;
}
Происходит ошибка во время выполнения.

Добавлено через 2 минуты
Используйте new
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:49  [ТС]     Как выделить память для класса #12
Именно потому, что я не знаю как это сделать, был посещен форум))
Допустим маллок каким то чудом выделил память для класса, вопрос в том как она в нем распределена будет...Это еще одна вещь, мучившая меня.
Насчет конкструктора, зачем мне конструктор вызываемый new?)

Добавлено через 52 секунды
Genius Ignat, Нельзя)
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 19:51     Как выделить память для класса #13
Насчет конкструктора, зачем мне конструктор вызываемый new?)
Пример с классом выше.
Хочешь ты этого или не хочешь указатель на таблицу виртуальных функций должен быть про инициализирован, поэтому конструктор.

Добавлено через 29 секунд
Без него ни как.
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:51     Как выделить память для класса #14
Цитата Сообщение от Miska Посмотреть сообщение
Насчет конкструктора, зачем мне конструктор вызываемый new?)
Вам то не зачем, а вот объект, под который выделяется память, будет очень раздосадован отсутствием вызова своего конструктора, особенно если он в конструкторе необходимые для своей нормальной жизнедеятельности ресурсы выделяет.
Miska
 Аватар для Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:53  [ТС]     Как выделить память для класса #15
Я в тупике)) Пошла думать)
CyBOSSeR
Эксперт C++
 Аватар для CyBOSSeR
2293 / 1663 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:56     Как выделить память для класса #16
Miska, книжку Г. Буч Объектно-ориентированный анализ и проектирование с собой возьмите, там поверхностно рассмотрено создание менеджера памяти. Надеюсь, думать будет легче.
Nick Alte
Эксперт С++
1590 / 982 / 115
Регистрация: 27.09.2009
Сообщений: 1,897
Завершенные тесты: 1
11.05.2010, 20:23     Как выделить память для класса #17
Строго говоря, создание объекта разделяется на 3 этапа - выделение памяти, заполнение служебных полей, инициализация. Если хотим выделять память под сложные объекты самостоятельно, последние две операции всё равно придётся возложить на new, в данном случае - на конструкцию, известную как in-place new, который получает в качестве аргумента адрес памяти, выделенной под создаваемый объект.
C++
1
2
3
4
5
6
7
8
9
10
11
12
template<typename T> T* MyAlloc()
{
    return static_cast<T*>(malloc(sizeof(T));
}
 
void foo()
{
    MyType *object = MyAlloc<MyType>();  // Это мы выделяем память
    object = new(object) MyType();    // А это - заполнение vtable и вызов конструктора при помощи in-place new
    object->VirtualFunction();
    free(object);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2010, 20:29     Как выделить память для класса
Еще ссылки по теме:

C++ Как динамически выделить память для конструкторов класса?
Как выделить память для двумерного массива указателей в куче? C++
C++ Как выделить память под динамические переменные при создании класса?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Genius Ignat
1233 / 771 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 20:29     Как выделить память для класса #18
Nick Alte:
Зверюга..
Yandex
Объявления
11.05.2010, 20:29     Как выделить память для класса
Ответ Создать тему
Опции темы

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