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

Перегрузка глобального оператора delete с параметрами - C++

Восстановить пароль Регистрация
 
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
26.09.2013, 18:12     Перегрузка глобального оператора delete с параметрами #1
Столкнулся с проблемой при перегрузке оператора delete с параметрами: почему-то всегда вызывается не мой оператор, а стандартный. Вот например такой код
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
63
64
65
66
67
#include <Windows.h>
#include <iostream>
using namespace std;
#include <malloc.h>
 
class World
{
public:
    World(int x);
    ~World();
private:
    int _x;
};
 
World::World(int x)
{
    _x=x;
    cout<<"World constructor, x="<<x<<endl;
}
 
World::~World()
{
    cout<<"World destructor"<<endl;
}
 
void* operator new(size_t size, World* world)
{
    cout<<"My operator new, size="<<size<<", world="<<world<<endl;
    return malloc(size);
}
 
void operator delete(void* pointer, World* world)
{
    cout<<"My operator delete, pointer"<<pointer<<", world="<<world<<endl;
    free(pointer);
}
 
class WorldObject
{
public:
    WorldObject(int y, World* world);
    ~WorldObject();
private:
    int _y;
    World* _world;
};
 
WorldObject::WorldObject(int y, World* world)
{
    _y=y;
    _world=world;
    cout<<"WorldObject constructor, y="<<y<<", world="<<world<<endl;
}
 
WorldObject::~WorldObject()
{
    cout<<"WorldObject destructor"<<endl;
}
 
int main()
{
    World world(10);
    WorldObject* worldObject=new(&world) WorldObject(5,&world);
    delete(&world,worldObject);
    system("pause");
    return 0;
}
не выводит, как следовало ожидать, собщения "My operator delete..." (скрин 1). По идее нужно писать не delete(&world,worldObject); а delete(worldObject,&world);, но тогда при выполнении программы возникает Debug Assertion Failed (скрин 2). У меня складывается впечатление, что происходит просто игнорирование парамеров delete кроме последнего, и для него вызывается стандартный delete. Компилятор Visual Studio 2010.
Миниатюры
Перегрузка глобального оператора delete с параметрами   Перегрузка глобального оператора delete с параметрами  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.09.2013, 18:12     Перегрузка глобального оператора delete с параметрами
Посмотрите здесь:

C++ Ошибка при использовании оператора delete в Visual Studio 2010
Перегрузка оператора new и delete C++
HELP! Ошибка при выполнении оператора delete[] C++
Перегрузка new и delete C++
C++ Повторное применение оператора delete
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
26.09.2013, 18:17     Перегрузка глобального оператора delete с параметрами #2
насколько мне известно оператор delete может принимать лишь 1 аргумент void*
+ должен определяться в самом классе
+ вызываться как delete obj;
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
26.09.2013, 19:13  [ТС]     Перегрузка глобального оператора delete с параметрами #3
На счёт 1 аргумента - наверно так и есть, только почему при объявлении оператора с несколькими параметрами компилятор тогда на это не ругается. А вот объявлять его в самом классе не обязательно, пробовал переопределить оператор вне класса, но с одним параметром void* - всё нормально работает, только он действует тогда сразу для всех классов, а вызывать можно как delete obj, так и delete(obj), пробовал, разницы здесь нет.
Виктор_Сен
 Аватар для Виктор_Сен
30 / 23 / 1
Регистрация: 01.08.2011
Сообщений: 176
26.09.2013, 22:46  [ТС]     Перегрузка глобального оператора delete с параметрами #4
Вот так можно получать в операторе delete параметры неявно (при условии, что деструктор класса WorldObject не изменяет значения нужных полей), причём это работает и при наследовании, но только для одного класса и его потомков
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <Windows.h>
#include <iostream>
using namespace std;
#include <malloc.h>
 
class World
{
public:
    World(int x);
    ~World();
private:
    int _x;
};
 
World::World(int x)
{
    _x=x;
    cout<<"World constructor, x="<<x<<endl;
}
 
World::~World()
{
    cout<<"World destructor"<<endl;
}
 
class WorldObject
{
public:
    WorldObject(int y, World* world);
    virtual ~WorldObject();
    void* operator new(size_t size, World* world);
    void operator delete(void* pointer, World* world);
    void operator delete(void* pointer);
protected:
    int _y;
    World* _world;
};
 
void* WorldObject::operator new(size_t size, World* world)
{
    cout<<"My operator new, size="<<size<<", world="<<world<<endl;
    return malloc(size);    
}
 
void WorldObject::operator delete(void* pointer, World* world)
{
    cout<<"My operator delete, world="<<world<<endl;
    free(pointer);
}
 
void WorldObject::operator delete(void* pointer)
{
    WorldObject* worldObject=(WorldObject*)pointer;
    cout<<"My operator delete, world="<<worldObject->_world<<endl;
    free(pointer);
}
 
WorldObject::WorldObject(int y, World* world)
{
    _y=y;
    _world=world;
    cout<<"WorldObject constructor, y="<<y<<", world="<<world<<endl;
}
 
WorldObject::~WorldObject()
{
    cout<<"WorldObject destructor"<<endl;
}
 
class Puls: public WorldObject
{
public:
    Puls(int z, int y, World* world);
    virtual ~Puls();
protected:
    int _z;
};
 
Puls::Puls(int z, int y, World* world):WorldObject(y,world)
{
    _z=z;
    cout<<"PlusObject constructor, z="<<z<<", world="<<world<<endl;
}
 
Puls::~Puls()
{
    cout<<"PlusObject destructor"<<endl;
}
 
int main()
{
    World world(10);
    WorldObject* worldObject=new(&world) WorldObject(5,&world);
    delete worldObject;
    Puls* plus=new(&world) Puls(10,20,&world);
    delete plus;
    system("pause");
    return 0;
}
Как видно, delete правильно определяет адрес world, без необходимости его передавать.
Миниатюры
Перегрузка глобального оператора delete с параметрами  
dimon_medved
0 / 0 / 0
Регистрация: 26.12.2012
Сообщений: 3
08.10.2013, 18:55     Перегрузка глобального оператора delete с параметрами #5
C++
1
delete(&world,worldObject);
delete принимает только 1 аргумент независимо от скобок, здесь срабатывает оператор запятая, которая из двух значений возвращает правое(т.е worldObject), следовательно при попытке передать (worldObject, &world) delete пытается удалить world
Yandex
Объявления
08.10.2013, 18:55     Перегрузка глобального оператора delete с параметрами
Ответ Создать тему
Опции темы

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