gpt4 book ai didi

c++ - C++ 示例中的新运算符重载

转载 作者:行者123 更新时间:2023-11-27 23:07:07 24 4
gpt4 key购买 nike

我有以下代码,我无法理解 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 语句是未定义的行为。

除非对象仅以完全相反的分配顺序进行释放,否则您的释放策略完全被破坏了。此外,在数组元素被用于一次分配后,由于在释放器中的赋值,它将永远不会被再次使用。

至于实际问题:分配的第一个Scalar分配在与缓冲区相同的位置,所以第一个Scalarbuf[0] 共享相同的内存。由于它们都由一个 int 组成,因此对一个的写入可能可以从另一个读取。当您构造 Scalar 时,它会将值 11 分配给共享内存。我认为这样做是未定义的行为,但我不确定。

关于c++ - C++ 示例中的新运算符重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22918367/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com