我正在用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
是否已成功分配?
谢谢!
答案 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 ++保证数组([]
,malloc
或new[]
)是连续的,但它们仅包含一种类型。通常,由于对齐问题,您无法将float, double, int, char
连续存储在一起。上面的array
就std::variant
对象而言是连续的,但其大小至少应为最大类型的大小。因此chars
不会打包在一起。
答案 2 :(得分:1)
那不是您分配内存的方式。您需要使用new
正确执行此操作。
请参见here。
答案 3 :(得分:1)
想测试连续变量的内存分配 不同类型
您可以使用结构并将所需的变量声明为成员,以便为不同数据类型进行连续的内存分配。
例如:
struct eg_struct
{
unsigned char abc;
unsigned int xyz;
}
请注意,如果需要,您可能需要pack结构。
这里不需要检查内存是否空闲。