如何检查某个内存地址是否可用于c ++?

时间:2019-07-04 09:27:22

标签: c++ pointers memory-management

我正在用C ++进行业余项目,并想测试不同类型变量的连续内存分配(例如具有不同类型变量的数组)。我如何检查特定的内存地址是否可用?

更多详细信息:

假设我们有以下代码:我们有一个整数int_var,(此变量位于哪个内存地址都无所谓),以便在该地址中分​​配不同类型的变量在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";
}

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

谢谢!

4 个答案:

答案 0 :(得分:4)

您假设此内存模型在DOS中有效,在DOS模式下,在实模式下,内存是连续的字节流。

现在我们有了分页(在x86或x64中),这是不可能的。因此,您不能对“附近”内存的存在做出任何假设。

您必须正确分配,这意味着使用C ++ shared_ptr / unique_ptr / STL。或者,new / malloc使用旧的(坏的)方式。

如果您希望变量彼此接近,请一次分配整个内存(例如,通过结构)。

答案 1 :(得分:2)

您不能,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不会打包在一起。

答案 2 :(得分:1)

那不是您分配内存的方式。您需要使用new正确执行此操作。

请参见here

答案 3 :(得分:1)

  

想测试连续变量的内存分配   不同类型

您可以使用结构并将所需的变量声明为成员,以便为不同数据类型进行连续的内存分配。

例如:

struct eg_struct
{
           unsigned char abc;
           unsigned int  xyz;
}

请注意,如果需要,您可能需要pack结构。

这里不需要检查内存是否空闲。