1

在运行时如何区分指针和引用?例如,如果我想在不知道它是否是指针的情况下释放数据类型的指针,我该怎么做?有什么方法可以判断变量是在堆栈上还是通过 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
4

5 回答 5

7

不,不是在一般情况下,也不是便携方式。如果您知道堆在内存中的位置,您可以做出有根据的猜测,但不是以任何可靠的方式。

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

于 2009-03-25T21:32:53.387 回答
4

如果它是 ANSI C,那么就没有引用之类的东西,所以你可能想改写你的问题来谈论堆分配的指针或堆栈分配的对象的指针。

通常堆的地址是“小”并且会增长,而堆栈是“大”并且会下降,但这只是一种启发式和不可移植的。

于 2009-03-25T21:34:15.643 回答
1

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

如果您需要使用 & 来获取某物的地址,那么您不能delete或释放它。否则,如果您要传递指针,则需要记录哪些函数有权访问delete或释放它。在 C++ 中执行此操作的最简单方法是使用智能指针类,例如 ashared_ptrscoped_ptr

于 2009-03-26T06:28:58.247 回答
1

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

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

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

于 2009-03-26T07:43:45.680 回答
0

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

于 2009-03-26T00:27:06.307 回答