【问题标题】:Differentiate Between Pointer and Reference at Run Time ANSI C++在运行时区分指针和引用 ANSI C++
【发布时间】:2009-03-25 21:30:02
【问题描述】:

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

【问题讨论】:

  • 这不是 C。或者,它看起来不像 C。
  • 还有你的“destInt(numRef);”在语法上根本不正确。不能将引用传递给接受 int * 的函数。
  • 可以但是引用变量的地址可以,就是这里的效果。 numRef 和 num 都指向内存中的相同位置。

标签: c++ pointers reference stack malloc


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果它是 ANSI C,那么就没有引用之类的东西,所以您可能想重新表述您的问题,讨论指向堆分配的指针或指向堆栈分配的对象的指针。

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2020-03-24
            • 1970-01-01
            • 2010-09-25
            • 2023-01-16
            • 2010-09-30
            • 1970-01-01
            • 2015-02-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多