如何在C++中检查某个内存地址是否可用?

Dan*_*mer 5 c++ pointers memory-management

我正在用 C++ 开发我的爱好项目,并且想要测试不同类型变量的连续内存分配(例如具有不同类型变量的数组)。如何检查特定内存地址是否可供使用?

更多细节:

假设我们有以下代码:我们有一个整数int_var(该变量位于哪个内存地址中并不重要),为了在 i 的地址之后的地址中分配不同类型的变量,int_var需要检查该地址是否可用,然后使用它。我尝试了以下代码:

int int_var = 5;
float* flt_ptr = (float*)(&int_var + (sizeof(int_var) / sizeof(int)));
// check if flt_ptr is successfully allocated
if (flt_ptr) { // successfully allocated
    // use that address
} else { // not successfully allocated
    cout << "ERROR";
}
Run Code Online (Sandbox Code Playgroud)

问题是:当我运行程序时,有时flt_ptr会成功分配并且没问题,有时则不会 - 但是当未成功分配时,它会抛出一个异常,显示“读取访问冲突...”而不是打印"ERROR"。这是为什么?也许我错过了一些关于检查是否flt_ptr成功分配的事情?还是做错了什么?flt_ptr如果是这样,在使用之前如何检查是否已成功分配?

谢谢!!

Qui*_*mby 3

你不能,C++ 内存模型不是那样工作的。

唯一有效的指针是通过“&”运算符获得的指针、从“new/malloc”和静态数组返回的指针。没有机制可以检查内存地址是否(仍然)有效或者对象是否已被销毁或根本不存在。因此,由程序员来管理指针的正确性。

由于上述原因,您的程序具有未定义的行为。

if(pointer)只检查是否pointer==0,仅此而已。请注意,这int n=5; int array[n];也不是有效的 C++。不确定您是否在使用它,但如果您使用,请不要使用。

根据评论,您需要一个异构容器。在这种情况下,请使用联合数组或更好的数组std::array<std::variant<int,double,char, float...>> array;。或者std::vector如果您需要动态大小。

C++ 保证数组([]mallocnew[])是连续的,但它们只包含一种类型。一般来说,float, double, int, char由于对齐问题,您不能连续存储在一起。上面的对象arraystd::variant对象方面是连续的,但其大小至少是最大类型的大小。所以chars不会打包在一起。

  • _“一般来说,由于对齐问题,您不能连续存储 `float、double、int、char` ”_ - 一般情况下:但请注意,大多数编译器上仍然有 `#pragma pack(1)`(假设可以处理未对齐的内存访问的平台)。 (2认同)