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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
#1

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

11.05.2010, 15:01. Просмотров 1067. Ответов 17
Метки нет (Все метки)

Привет, я пишу библиотеку управления памятью. На данный момент я выделяю память вот так
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))
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.05.2010, 15:01
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как выделить память для класса (C++):

Как динамически выделить память для конструкторов класса? - C++
подскажите как динамически выделить память для конструкторов класса? class circle { double x,y,r; public: void...

Как выделить динамически память для данных класса - C++
Как выделить динамически память для данных класса ? class circle { double x,y,r; public:void In(); void Out(); ...

Как выделить память под динамические переменные при создании класса? - C++
В прошлой теме ответ получил, но не до конца. Вопрос такой, как выделить память под динамические переменные? Вот часть кода ...

Как выделить память для двухмерного массива? - C++
Как выделить память для двухмерного массива в С++ a=new int???

Как выделить память для динамического массива? - C++
Как выделить память для динамического массива? typedef TPrimitives *TPrimitive; //... TPrimitives Primitives; Мне нужно выделить...

Как динамически выделить память для строкового массива? - C++
Собственно сам вопрос.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Nick Alte
Эксперт С++
1637 / 1009 / 119
Регистрация: 27.09.2009
Сообщений: 1,945
Завершенные тесты: 1
11.05.2010, 18:53 #2
А чем вызвано столь причудливое ограничение?
0
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 18:59  [ТС] #3
Моими соображениями, потому как оператор new выделяет для класса память и не нуждается в указании размера для выделения. Я хочу сделать что то похожее, если возможно)
0
easybudda
Модератор
Эксперт CЭксперт С++
9625 / 5573 / 947
Регистрация: 25.07.2009
Сообщений: 10,708
11.05.2010, 19:11 #4
Miska, наверное MyAlloc(sizeof(MyClass))... А чем Вам простое
C++
1
2
3
...
MyClass *pMyClass = new MyClass();
...
не угодило?
0
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:13  [ТС] #5
easybudda, задание гласит без new, т.к оно не генерирует bad_alloc.
0
Genius Ignat
1236 / 774 / 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;
}
Так сойдет.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:20 #7
Цитата Сообщение от Miska Посмотреть сообщение
easybudda, задание гласит без new, т.к оно не генерирует bad_alloc.
Miska, чего ты вы напутали, new согласно стандарту генерирует std::bad_alloc.
0
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:27  [ТС] #8
CyBOSSeR, http://support.microsoft.com/kb/167733 - по поводу нью.


Genius Ignat, спасибо, попробую.
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
11.05.2010, 19:33 #9
Для массива выделить не получиться. надо подкорректировать макрос дополнительным параметром.
Miska: new согласно генерирует исключение.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:36 #10
Miska, вы список IDE для которых это актуально в конце статьи видели?
Там самая новая 2005 года, да и то Express Edition. Руководствоваться нужно стандартом, а не статьями Microsoft.
Ладно, это полбеды, new кроме выделения памяти еще и конструкторы вызывает, как с этим бороться собираетесь?
0
Genius Ignat
1236 / 774 / 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
0
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:49  [ТС] #12
Именно потому, что я не знаю как это сделать, был посещен форум))
Допустим маллок каким то чудом выделил память для класса, вопрос в том как она в нем распределена будет...Это еще одна вещь, мучившая меня.
Насчет конкструктора, зачем мне конструктор вызываемый new?)

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

Добавлено через 29 секунд
Без него ни как.
0
CyBOSSeR
Эксперт C++
2302 / 1672 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
11.05.2010, 19:51 #14
Цитата Сообщение от Miska Посмотреть сообщение
Насчет конкструктора, зачем мне конструктор вызываемый new?)
Вам то не зачем, а вот объект, под который выделяется память, будет очень раздосадован отсутствием вызова своего конструктора, особенно если он в конструкторе необходимые для своей нормальной жизнедеятельности ресурсы выделяет.
0
Miska
2 / 2 / 1
Регистрация: 11.05.2010
Сообщений: 26
11.05.2010, 19:53  [ТС] #15
Я в тупике)) Пошла думать)
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.05.2010, 19:53
Привет! Вот еще темы с ответами:

Как выделить память для двумерного массива указателей в куче? - C++
Есть массив вида: unsigned char *ddtКак выделить память для такого массива в куче? Должен получиться двумерный массив указателей. Сами...

Можно ли динамически выделить память под массив указателей, на объекты класса? - C++
Прошу прощения если не правильно назвал вопрос. Не знаю как правильно сформулировать. Можно ли строчку VisualizationTools* VT; заменить...

Как в отдельной функции выделить память для динамического массива, объявленного в main - C++
Доброго времени суток. Передо мной стоит задача выделения памяти для динамического массива в отдельной функции. То есть я объявляю в...

выделить память для массива*[] - C++
привет. чего-то не получается организовать работу массива char *c; это динамический массив строк длиной 10 при конструкторе ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
11.05.2010, 19:53
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru