перегрузка нового оператора в примере c ++

0

У меня есть следующий код, который я не могу понять статус после одной строки в главном.

#include <iostream>

typedef unsigned long size_t;

const int MAX_BUFFER=3;
int buf[MAX_BUFFER]={0}; //Initialize to 0
int location=0;

struct Scalar {
    int val;
    Scalar(int v) : val(v) { };

    void* operator new(size_t /*not used*/) {
        if (location == MAX_BUFFER) {
            throw std::bad_alloc();
        } else {
            int* ptr = &buf[location];
            if ( buf[location] == 0) {
                location++;
            } else {
                return ptr;
            }
        }
    }
    void operator delete(void* ptr) {
        size_t my_loc = (int*)ptr - buf;
        buf[my_loc] = location;
        location = my_loc;
    }
};

int main() {
    Scalar *s1 = new Scalar(11);
    cout << buf[0];
}

Почему массив buf в конце этого кода содержит значение 11 в...? Я не уверен, где роль val играет роль.

  • 2
    Я бы не рекомендовал вводить определение собственного size_t . Просто используйте предоставленный.
  • 0
    Вы уверены насчет else {return ptr;} ? Я думаю, что это неправильно ..
Теги:
operator-keyword
overloading

2 ответа

2
Лучший ответ

Я не понимаю, почему вы только условно увеличиваете location после выделения, и если вы увеличиваете location, то функция не выполняет оператор return который является неопределенным поведением.

Ваша стратегия освобождения полностью разрушена, если только объекты не освобождаются в совершенно противоположном порядке распределения. Кроме того, после того, как элемент массива был использован для одного распределения, он больше никогда не будет использоваться из-за назначения в деллалокаторе.

Что касается фактического вопроса: первый выделенный Scalar выделяется в том же месте, что и буфер, поэтому первый Scalar и buf[0] одну и ту же память. Поскольку они оба состоят из одного int, записи могут быть доступны для чтения из другого. И когда вы создаете Scalar, он присваивает значение 11 общей памяти. Я думаю, что делать это - неопределенное поведение, но я не уверен.

  • 0
    я знаю, что это не лучший способ работать. Я хотел бы понять, как значение 11 попадает в buf [0].
  • 0
    @ user3286882: отредактированный пост, я неправильно прочитал вопрос в первый раз
2

Значение 11 попадает в буфер благодаря

Scalar(int v) : val(v) { };

который принимает параметр и копирует его в член val.

Если экземпляр класса выделяется по адресу буфера (из-за реализации customized operator::new (size_t)), то возможно, что его первый член попадает в первый элемент массива.

Обратите внимание, что этот код полностью нарушен по нескольким причинам, уже указанным Mooing Duck.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню