繁体   English   中英

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

[英]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分配在相同的位置作为缓冲器分配,所以第一个Scalarbuf[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM