c++ - 请解释一下缓冲区没有足够内存时非分配运算符 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变量需要的少。但是没有抛出异常。我有能力检测到这种糟糕的情况还是这种情况正常?
解决方案
但是没有抛出异常。
你似乎期待一个例外,但没有。您的代码具有未定义的行为。
我有能力检测到这种糟糕的情况还是这种情况正常?
你可以抛出异常:
#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';
}
}
推荐阅读
- android - 是否可以从 USB 摄像头流式传输视频和从移动麦克风流式传输音频以在 android 中进行 RTMP 流式传输
- azure - Azure 存储队列 - 异地冗余
- date - 在 XSD 中验证日期或日期时间的日期范围?
- scala - 如何映射所有元素都是类型类实例的 HList?
- azure - Azure 搜索架构迁移
- android - 支持 FreeFormWindow 的应用程序在角落启动
- excel - 如何从 pyspark 数据框中保存带有多张工作表的 excel 文件
- c++ - 如何将 std::array 元素附加或插入到 std::vector 中?
- python - Python - .insert() 方法只替换单词的第一个字母?
- sql - Google BigQuery SQL 是否有等待方法