首页 > 解决方案 > 请解释一下缓冲区没有足够内存时非分配运算符 new 的情况

问题描述

我写了这段代码:

 try
    {
        char* buffer = (char*)malloc(sizeof(char));
        int* bytes = new(buffer) int();
        *bytes = 10;
        std::cout<<*bytes;
        free(buffer);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }

我认为当我调用 operator new时这段代码有危险,因为buffer变量的内存比bytes变量需要的少。但是没有抛出异常。我有能力检测到这种糟糕的情况还是这种情况正常?

标签: c++exceptionmemorynew-operator

解决方案


但是没有抛出异常。

你似乎期待一个例外,但没有。您的代码具有未定义的行为。

我有能力检测到这种糟糕的情况还是这种情况正常?

你可以抛出异常:

#include <type_traits>
#include <iostream>

int main() {
 try
    {
        char* buffer = (char*)malloc(sizeof(char));
        if constexpr (sizeof(char) != sizeof(int)) throw std::runtime_error("buffer cannot hold an int");
        int* bytes = new(buffer) int();
        *bytes = 10;
        std::cout<<*bytes;
        free(buffer);
    }
    catch(const std::exception& e)
    {
        std::cerr << e.what() << '\n';
    }
}

推荐阅读