C++ c+中的新运算符重载+;例子
我有下面的代码,我不能理解主代码中一行之后的状态C++ c+中的新运算符重载+;例子,c++,overloading,operator-keyword,C++,Overloading,Operator Keyword,我有下面的代码,我不能理解主代码中一行之后的状态 #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 ne
#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];
}
#包括
typedef无符号长尺寸\u t;
const int MAX_BUFFER=3;
int buf[MAX_BUFFER]={0}//初始化为0
int位置=0;
结构标量{
int-val;
标量(intv):val(v){};
void*运算符新(大小\u t/*未使用*/){
如果(位置==最大缓冲区){
抛出std::bad_alloc();
}否则{
int*ptr=&buf[位置];
if(buf[位置]==0){
位置++;
}否则{
返回ptr;
}
}
}
void操作符删除(void*ptr){
我的位置大小=(int*)ptr-buf;
buf[我的位置]=位置;
位置=我的位置;
}
};
int main(){
标量*s1=新标量(11);
cout我不明白为什么在分配后只有条件地递增location
,如果递增location
,则函数不会执行return
语句,这是一种未定义的行为
除非对象仅以与分配完全相反的顺序进行释放,否则您的释放策略将完全被破坏。此外,在数组元素用于一次分配后,由于deallocator中的分配,它将不再被使用
至于实际问题:分配的第一个Scalar
与缓冲区分配在同一位置,因此第一个Scalar
和buf[0]
共享相同的内存。由于它们都由一个int
组成,对其中一个的写入可能可以从另一个读取。当你构造标量时,它会将值11
分配给共享内存。我认为这样做是未定义的行为,但我不确定。我不明白你为什么只会选择传统上,在分配后递增location
,如果递增location
,则函数不会执行return
语句,这是一种未定义的行为
除非对象仅以与分配完全相反的顺序进行释放,否则您的释放策略将完全被破坏。此外,在数组元素用于一次分配后,由于deallocator中的分配,它将不再被使用
至于实际问题:分配的第一个Scalar
与缓冲区分配在同一位置,因此第一个Scalar
和buf[0]
共享相同的内存。由于它们都由一个int
组成,对其中一个的写入可能可以从另一个读取。当你构造标量时,它会将值11
分配给共享内存。我认为这样做是未定义的行为,但我不确定。值11进入缓冲区渴望
Scalar(int v) : val(v) { };
获取参数并将其复制到成员val
如果类实例被分配到缓冲区的地址(因为定制的操作符::new(size\t)
实现),那么它的第一个成员可能会在第一个数组元素中结束
请注意,由于Mooing Duck已经指出的几个原因,此代码完全被破坏。值11由于
Scalar(int v) : val(v) { };
获取参数并将其复制到成员val
如果类实例被分配到缓冲区的地址(因为定制的操作符::new(size\t)
实现),那么它的第一个成员可能会在第一个数组元素中结束
请注意,由于Mooing Duck已经指出的几个原因,此代码完全被破坏。我不建议您自己定义大小。\u t
。只使用提供的一个。您确定其他{return ptr;}
?我认为这是错误的。我不建议您自己定义大小。\u t
。只使用提供的一个。您确定其他{return ptr;}
?我认为这是错误的。我知道这不是最好的工作方式。我想了解值11是如何进入buf[0]的@user3286882:edited post,我第一次误读了这个问题,我知道这不是最好的工作方式。我想了解值11如何进入buf[0]。@user3286882:edited post,我第一次误读了这个问题