在运行时ANSI C ++中区分指针和引用

时间:2009-03-25 21:30:03

标签: c++ pointers reference stack malloc

如何在运行时区分指针和引用?例如,如果我想释放数据类型的指针而不知道它是否是指针,我该怎么办呢?是否有任何方法可以判断是否已在堆栈上或通过malloc()分配变量?

void destInt(int* var)
{
   free(var);
}


int num = 3;
int &numRef = num;
int* numPtr = (int*)malloc(sizeof(int));
*numPtr = num;

destInt(&numRef); //Syntactically correct but generates invalid pointer()
destInt(numPtr); //Fine syntactically and logically

5 个答案:

答案 0 :(得分:7)

不,不是一般情况下,不是以便携方式。如果你知道堆内存在哪里,你可以做出有根据的猜测,但不能以任何可靠的方式。

编辑:还要注意C没有引用。 C中的& -operator用于获取变量的地址。

答案 1 :(得分:4)

如果它是ANSI C,那么就没有引用这样的东西,所以你可能想要重新解释你的问题来讨论指向堆分配的指针或指向堆栈分配对象的指针。

堆的地址通常是“小”并且长大,堆栈是“大”并且变大,但这只是一种启发式和非便携式。

答案 2 :(得分:1)

在C ++中,区分它是引用还是指针的信息是编译时类型信息的一部分。在C中,这是语义上无关的区别。

如果你需要使用&为了得到某些东西的地址,然后你不能delete或释放它。否则,如果你传递一个指针,你需要记录哪些函数有权{{1或者释放它。在C ++中执行此操作的最简单方法是使用智能指针类,如deleteshared_ptr

答案 3 :(得分:1)

无论你想要完成什么......都不要这样做。

您通常可以获取堆栈的边界,但这通常是一个非常漂亮的编译器/平台特定进程。与堆相同。如果您使用自己的版本挂钩new和delete,则可能知道堆的开始和结束位置。否则你不会。

然而,你吠叫的树不是一个好树。如果您确信您确实需要这样做,请使用指针传递信息。将它包装在一个结构中,该结构也有一个名为needsFree或者其他东西的bool。但除此之外,你遇到这个问题的事实常常表明你试图解决的问题可以用更清洁的方式解决。

答案 4 :(得分:0)

使用malloc时,内存不是在STACK中分配的,而是在堆中。