У меня есть следующий код, который я не могу понять статус после одной строки в главном.
#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
играет роль.
Я не понимаю, почему вы только условно увеличиваете location
после выделения, и если вы увеличиваете location
, то функция не выполняет оператор return
который является неопределенным поведением.
Ваша стратегия освобождения полностью разрушена, если только объекты не освобождаются в совершенно противоположном порядке распределения. Кроме того, после того, как элемент массива был использован для одного распределения, он больше никогда не будет использоваться из-за назначения в деллалокаторе.
Что касается фактического вопроса: первый выделенный Scalar
выделяется в том же месте, что и буфер, поэтому первый Scalar
и buf[0]
одну и ту же память. Поскольку они оба состоят из одного int
, записи могут быть доступны для чтения из другого. И когда вы создаете Scalar
, он присваивает значение 11
общей памяти. Я думаю, что делать это - неопределенное поведение, но я не уверен.
Значение 11 попадает в буфер благодаря
Scalar(int v) : val(v) { };
который принимает параметр и копирует его в член val
.
Если экземпляр класса выделяется по адресу буфера (из-за реализации customized operator::new (size_t)
), то возможно, что его первый член попадает в первый элемент массива.
Обратите внимание, что этот код полностью нарушен по нескольким причинам, уже указанным Mooing Duck.
size_t
. Просто используйте предоставленный.else {return ptr;}
? Я думаю, что это неправильно ..