|
|
1
2
只有在分配点上记住它,您才能知道这一点。在这种情况下,您要做的是将指针存储在智能指针类中,并将其存储在类代码中。
如果你使用
|
|
|
2
2
一旦你需要这些知识,你就已经失去了。为什么?因为即使省略了错误的删除[],仍然存在内存泄漏。 创建内存的人应该总是删除它的人。如果在某些情况下指针可能丢失(或被覆盖),那么您必须保留一份指针的副本,以便进行正确的删除。 |
|
|
3
2
在标准C++中,没有一种方法可以确定指针是否指向动态分配的内存。注意,字符串文本没有在堆栈上分配。 |
|
|
4
2
正如大多数用户在这里所说,没有标准的方法来发现您要处理的内存。 而且,正如许多用户指出的,这是一种有点反常的情况,在这种情况下,您将一个指针传递给一个函数,如果它被分配到堆上,那么该函数将自动删除它。 但是如果你坚持的话,仍然有一些方法可以发现哪一种记忆属于哪一种类型。 你实际上处理三种类型的记忆
例如:
现在让我们来区分它们。我将用Windows API和x86汇编程序来描述这一点(因为我知道这一点:) 让我们从栈内存开始。
如果指针被分配到另一个线程的堆栈上,则应该通过以下方式获取其堆栈指针:
全局存储器
如果您正在编写一个dll,您应该将它的模块句柄(实际上是它的基映射指针)放在
堆 理论上,如果内存既不是全局的也不是堆栈的,那么可以假定它是在堆上分配的。 但实际上这里有一个很大的歧义。
您应该知道堆有不同的实现(例如,通过
您可以通过
总之:
|
|
|
5
1
我认为没有(简单)的方法来判断内存在哪里被分配(也许您可以使用调试器来确定它,但这显然不是您想要的)。底线是:不要做你在案例2中做的事情。 |
|
|
6
0
在情况2中,mydata=“value”会导致内存泄漏,因为不再有对从new返回的内存的引用。 |
|
|
7
0
要做到这一点,没有简单或标准的方法。您可以截获堆分配函数,并将每个内存分配区域放在一个列表中。您的“isheap”函数应该检查传递给函数的区域是否是列表中的区域。这只是一个提示——几乎不可能以跨平台的方式做到这一点。 但又一次-你为什么需要那个? |