Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的新运算符重载+;例子_C++_Overloading_Operator Keyword - Fatal编程技术网

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,我第一次误读了这个问题