将内存分配给一个指针,将另一个指针指向同一个指针,并删除第二个指针
Allocating memory to a pointer, pointing another pointer to the same and deleting the second
这样的代码会做正确的内存释放吗?
int main(){
int *pointerA, *pointerB;
pointerA = new int[15]();
for (int i=0; i<15; i++)
pointerA[i] = i*2;
pointerB = pointerA;
if (pointerA != NULL)
pointerA = NULL;
// Some operation here ...
for (int i=0; i<15; i++)
std::cout << i << " : " << pointerB[i] << std::endl;
if (pointerB != NULL)
delete [] pointerB;
pointerB = NULL;
return 0;
}
我使用pointerA创建一个指针,但使用pointerB释放。pointerB指向与pointerA相同的位置。
我认为它应该正确地释放,但我想确保。有没有一种方法可以有效地测试它?也许创建一个巨大的数组然后检查内存使用情况??
谢谢
是的,您的代码示例将正确地释放所有已分配的内存。
如果您在pointerA
设置为NULL
之前设置一个断点,并比较pointerA
和pointerB
指向的内存地址,您将看到它们指向内存中的相同位置。因此,使用哪个变量来删除内存并不重要,因为在任何情况下都会删除内存中的相同位置。
是的,使用第二个指针释放内存是完全可以的。你可以通过运行
来测试$ valgrind --log-file=/tmp/memcheck.log --tool=memcheck
--leak-check=full --show-reachable=yes --num-callers=20 ./your_tool
$ cat /tmp/memcheck.log
如果你试图删除一些你没有分配的东西,你会看到错误。
答案是"通常"。有两件事我要提醒你。确保在使用"new"时也使用"delete",或者使用malloc()时一定要使用free()。运行时库可以使用不同的实现,其中尝试将"new"answers"free()"或"malloc()"answers"delete"结合起来可能会导致泄漏。
这也可能是一个问题,如果你正在处理两个单独链接的库,比如你可能会发现一个。dll和一个。exe,或者两个。dll。在"new"期间分配内存的运行时将在该模块的表中分配内存,但如果删除发生在不同的模块中,"delete"将不会指向相同的内存分配表。
一般来说,我强烈建议遵循内存的"分配器"与内存的"释放器"相同的模式。参考RAII获得最佳实践相关文章:
- C++-试图将函数指针推回到另一个CPP文件中的矢量时出错
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将指针从一个void函数传递到另一个C++
- 如果C++对象的类在另一个boost模块中声明,如何使用boost将指向该对象的指针返回到python
- 将指针分配给另一个指针时会发生什么情况?
- 将指向给定子类的指针从一个向量复制到另一个向量
- C++将一个指针分配给另一个指针时执行的类型检查
- 将一个类的方法指针存储到另一个类中
- 是否可以使用智能指针成员设置具有另一个结构的结构?
- 初始化类中的指针数组,并在另一个类中检索它
- 从另一个指针指向函数的指针
- 使用指向成员函数的指针在另一个类中调用类构造函数
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 无法将指向类的成员函数的函数指针作为参数传递给同一类的另一个成员函数
- 无法"this"指针传递到另一个类并在 CPP 中调用该类的任何方法
- 如果类"A"具有指向另一个类的指针,则"B" A 可以访问 B 类公共方法
- 如何使用指针从另一个类访问属性
- 如何从另一个嵌套类中调用某个封闭类的嵌套类的函数指针成员的值?
- C++ 无效双指针干扰另一个
- 两个抽象类,派生自同一个基类.如何访问从一个抽象类到另一个抽象类的指针