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

Создание объекта в области памяти - C++

Восстановить пароль Регистрация
 
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 00:24     Создание объекта в области памяти #1
Здорова!
Тут вообщем не получается создать в одной и той же области памяти повторно объекты
От есть код:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//fynkci9 clone()
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
//bazovui klacc dl9 Arena
class Arena
{
    int valArena;
public:
    virtual void* alloc(size_t)=0;
};
 
//klacc potomok Arena
class Arena_1 : public Arena
{
public:
    // ecli virtual dobovl9yu to owibka xz. pochemy
    virtual void* alloc(size_t size)
    {
        cout <<"alloc"<<endl;
        return this;
    }
};
 
//klacc ob6ektu kotorogo bydyt vctraivatc9
class X
{
public:
    int val;
    X():val(0){}
    X(int a):val(a){}
    X(X& a):val(a.val){}
    X* clone(Arena_1* p)
    {
        return new(p)X(*this);
    }
};
 
//peregryzka new
void* operator new(size_t size, Arena_1* a)
{
    cout <<"mu tyt"<<endl;//<<' '<<size<<endl; //exit(1);
    a->alloc(size);
}
 
int main()
{
    Arena_1* p=new(Arena_1);//cozdaem oblact6 pam9ti tipa Arena_1
    //X a;
    X* c=new(p)X;//pervui toko normal6no vctraivaetc9
    //a vce octal6nue idyt c owibkoi
    X* b=new(p)X;
    //X* d=a.clone(p);
    //X* k=a.clone(p);
    //cout <<p<<' '<<c<<' '<<b<<' '<<d<<' '<<k<<endl;
        
    
    return 0;
}
Первый раз когда я создаю в области на которую указывает p объект, то он нормально создается, но почемуто когда второй раз, то выводит ошибку (Ошибка сегментирования (сделан дамп памяти) ) ?????
Должно все время создавать объекты, столько сколько нужно, а не то шо щас, один создало и шо мне новую память выделять? Где то ошибка скорее всего в классе с виртуальными функциями мб чо то не так, потому, что если для одного класса создаю, не потомка, а просто для одного, то все работает так как положено, но мне нужно для потомка сделать. Hellp!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.04.2013, 00:34     Создание объекта в области памяти #2
ninja2, И вы серьезно думаете что это должно работать?
Вы в память объекта записали другой объект
C++
1
X* c=new(p)X;//pervui toko normal6no vctraivaetc9
Все. Теперь в p записан X, а не Arena1. Нету таблицы виртуальных функций. При вызове alloc идет сегфолт.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 01:00  [ТС]     Создание объекта в области памяти #3
Цитата Сообщение от ForEveR Посмотреть сообщение
Все. Теперь в p записан X, а не Arena1. Нету таблицы виртуальных функций. При вызове alloc идет сегфолт.
Так смысл задания в этом я не думаю я уверен оно должно работать, я уже просто проверял и работало для одного класса.
Ну от отак же работает:
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//fynkci9 clone()
#include <iostream>
using std::cout;
using std::endl;
#include <cstdlib>
using std::exit;
 
//bazovui klacc dl9 Arena
class Arena
{
    int valArena;
public:
    virtual void* alloc(size_t)=0;
};
 
//klacc potomok Arena
class Arena_1 //: public Arena
{
public:
    // ecli virtual dobovl9yu to owibka xz. pochemy
    void* alloc(size_t size)
    {
        cout <<"alloc"<<endl;
        return this;
    }
};
 
//klacc ob6ektu kotorogo bydyt vctraivatc9
class X
{
public:
    int val;
    X():val(0){}
    X(int a):val(a){}
    X(X& a):val(a.val){}
    X* clone(Arena_1* p)
    {
        return new(p)X(*this);
    }
};
 
//peregryzka new
void* operator new(size_t size, Arena_1* a)
{
    cout <<"mu tyt"<<endl;//<<' '<<size<<endl; //exit(1);
    a->alloc(size);
}
 
int main()
{
    Arena_1* p=new(Arena_1);//cozdaem oblact6 pam9ti tipa Arena_1
    X a;
    X* c=new(p)X;//pervui toko normal6no vctraivaetc9
    //a vce octal6nue idyt c owibkoi
    X* b=new(p)X;
    X* d=a.clone(p);
    X* k=a.clone(p);
    cout <<p<<' '<<c<<' '<<b<<' '<<d<<' '<<k<<endl;
        
    
    return 0;
}
Если так работает, то выше в коде я шо то с полиморфизмом напутал, тут если добавить virtual к alloc то тоже не работает.
Думаю в самом первом коде, где то чо то с полиморфизм не срабатывает или как его называют диспетчеризация.

Там еще в alloc() нужно размеры проверять чтобы помещаемый объект был не больше области памяти. Не понятно чо оно не работает, хотя в книге написано должно работать.

Но оно и без размеров тоже работает если допустим помещаемый объект содержит два члена типа int. а объект области, то при помещении объект X становиться уже не 8 байт, а 4.

Цитата Сообщение от ForEveR Посмотреть сообщение
Все. Теперь в p записан X, а не Arena1. Нету таблицы виртуальных функций. При вызове alloc идет сегфолт.
Я и через static_cast туда загонял Arena_1 но всерамно ничо не помогает, а выделять новый указатель, тода смысл теряется.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.04.2013, 01:06     Создание объекта в области памяти #4
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну от отак же работает:
Потому что у тебя нет указателя на таблицу виртуальных функций в таком случае. Инту из X перезаписывать нечего.

Добавлено через 4 минуты
У тебя и твой первый код будет работать, если убрать из X все переменные. В твоем случае int val.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 01:07  [ТС]     Создание объекта в области памяти #5
Цитата Сообщение от Vourhey Посмотреть сообщение
Потому что у тебя нет указателя на таблицу виртуальных функций в таком случае. Инту из X перезаписывать нечего.
А как этот указатель создать?
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.04.2013, 01:12     Создание объекта в области памяти #6
Цитата Сообщение от ninja2 Посмотреть сообщение
А как этот указатель создать?
Он в твоем первом коде создается. Тебе о нем зачем думать? Работа с таблицами виртуальных функций - забота компилятора.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 01:17  [ТС]     Создание объекта в области памяти #7
Цитата Сообщение от Vourhey Посмотреть сообщение
Он в твоем первом коде создается. Тебе о нем зачем думать? Работа с таблицами виртуальных функций - забота компилятора.
А если я отак делаю:
C++
1
X* b=new(static_cast<Arena_1*>(p))X;
То уже в p у меня как бы Arena_1 и значит таблица виртуальных функций должна создаться?
Или там так и осталась таблица от X ????
Ошибка всерамно даже так.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.04.2013, 01:19     Создание объекта в области памяти #8
Цитата Сообщение от ninja2 Посмотреть сообщение
То уже в p у меня как бы Arena_1
Нет. Это приведение, а не создание объекта. Точнее, в p он у тебя и так уже был. И вот эти извращение ничего не изменят.
Цитата Сообщение от ninja2 Посмотреть сообщение
значит таблица виртуальных функций должна создаться?
Это зависит от наличия виртуальных функций в классе.
Цитата Сообщение от ninja2 Посмотреть сообщение
Или там так и осталась таблица от X ????
Какая таблица от Х? Откуда ей у Х вообще взяться?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 01:24  [ТС]     Создание объекта в области памяти #9
Цитата Сообщение от Vourhey Посмотреть сообщение
Какая таблица от Х? Откуда ей у Х вообще взяться?
Ну я имел введу пустая таблица, ну или если б были б в Х виртуальные функции то тогдаб его таблица была б.
Ладно я в этом слабо шарю щас буду разбирать.
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.04.2013, 01:31     Создание объекта в области памяти #10
Цитата Сообщение от ninja2 Посмотреть сообщение
Ну я имел введу пустая таблица
Пустая таблица никому не нужна. Поэтому ее нет. Потому что она пустая. Поэтому она не существует.
Цитата Сообщение от ninja2 Посмотреть сообщение
ну или если б были б в Х виртуальные функции то тогдаб его таблица была б.
Да. Только я не понимаю, к чему ты к иксу привязался... Если б была таблица, то перетер бы указатель в Х, указатель арены_1 и опять получилась бы лажа. Не обязательно с сегофлтом, но лажа.

Добавлено через 3 минуты
Но ты можешь еще себя повеселить с первым кодом. Сделай у себя в Х конструктор по умолчанию пустым
X(){}
Тогда val не будет иницилироваться нулем и указатель на таблицу не перетрется.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 01:41  [ТС]     Создание объекта в области памяти #11
Цитата Сообщение от Vourhey Посмотреть сообщение
Но ты можешь еще себя повеселить с первым кодом. Сделай у себя в Х конструктор по умолчанию пустым
X(){}
Тогда val не будет иницилироваться нулем и указатель на таблицу не перетрется.
А я теперь понял как это использовать можно. Создаешь просто пустые объекты, а затем уже вручную их инициализируешь. Щас попробую.

Добавлено через 20 минуты
Vourhey, О молодец! Как раз то что надо. Мне это и нужно было. Конструктор пустой нужно было создать. Я б фиг бы додумался. СПС. (Заработало как положено)
Vourhey
Почетный модератор
6468 / 2243 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
22.04.2013, 01:42     Создание объекта в области памяти #12
Цитата Сообщение от ninja2 Посмотреть сообщение
Создаешь просто пустые объекты, а затем уже вручную их инициализируешь
Чего-чего?
Цитата Сообщение от ninja2 Посмотреть сообщение
Мне это и нужно было
Навряд ли получившаяся белиберда на соплях держится.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
22.04.2013, 02:13  [ТС]     Создание объекта в области памяти #13
Vourhey, Да и правда мыж когда в ручную инициализируем, то таблица наверно тоже пропадет.
Ну а как же тогда это можно на практике применить? Это ж хорошо бы было б если б можно по кругу инициализировать один и тот же указатель разными объектами, память экономилась бы. Так же в играх делается я вроде читал. Или они там наверно не на иерархии классов строятся, а просто на одном классе без виртуальных функций. Да скорее всего без виртуальных функций строятся. Щас попробую не перегружать а просто в базовом классе поменяю названия виртуальных функций и конструктор нулем буду инициализировать мб тогда заработает.

Добавлено через 4 минуты
Вообщем работает главное токо виртуальные функции не определять и все норм.
А щас попробую если в ручную инициализировать а потом вызвать пойдет или нет просто интересно.

Добавлено через 4 минуты
Нет с виртуальными невкакую не хочет ну да и ладно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.04.2013, 07:24     Создание объекта в области памяти
Еще ссылки по теме:

C++ Создание объекта класса, чтобы он постоянно висел в памяти, и чтобы память выделялась один раз
Создание объекта в области памяти C++
Создание объекта в функции и возврат объекта из нее C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
22.04.2013, 07:24     Создание объекта в области памяти #14
ninja2, Во-первых: написать нормально работающий менеджер памяти - задача нетривиальная.
Во-вторых: это нужно крайне редко.
В-третьих: перед записью нового объекта неплохо бы вызывать деструктор старого.
Yandex
Объявления
22.04.2013, 07:24     Создание объекта в области памяти
Ответ Создать тему
Опции темы

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