[英]new operator overloading in c++ example
我有以下代码,我无法理解main中的一行。
#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
语句。
除非对象仅按照完全相反的分配顺序进行重新分配,否则您的重新分配策略将完全失效。 另外,在将数组元素用于一种分配之后,由于在deallocator中进行了分配,因此将不再使用它。
至于实际问题:第一Scalar
分配在相同的位置作为缓冲器分配,所以第一个Scalar
和buf[0]
共享相同的存储器。 由于它们均由单个int
组成,因此对另一个的写入可能是可读的。 并且在构造Scalar
,它会将值11
分配给共享内存。 我认为这样做是不确定的行为,但是我不确定。
由于以下原因,值11进入缓冲区
Scalar(int v) : val(v) { };
它接受参数并将其复制到成员val
。
如果类实例分配在缓冲区的地址处(由于自定义的operator::new (size_t)
实现),则其第一个成员可能会出现在第一个数组元素中。
请注意,由于Mooing Duck已指出的几个原因,此代码已被完全破坏。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.