代码如下:
#include <stdio.h>
#include <stdlib.h>
struct B {
int data_b;
};
struct A {
int data_a;
struct B b;
};
int main() {
struct A *pa;
struct B *pb;
pa = (struct A *) malloc (sizeof(struct A));
//pb = (struct B *) malloc (sizeof(struct B));
pa->data_a = 5;
pb = &pa->b;
pb->data_b = 6;
printf("%d %d\n", pa->data_a, pb->data_b);
system("pause");
//free(pb);
free(pa);
return 0;
}
执行后,正确输出 5 6
但如果加上注释的那两行,VS报错如下:
Windows 已在 ***.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 ***.exe 中或它所加载的任何 DLL 中有 Bug。
原因也可能是用户在 ***.exe 具有焦点时按下了 F12。
输出窗口可能提供了更多诊断信息。
请问为何会出现此错误。
在此情况下,pb只作为指向另一结构的指针,是否无需用malloc分配内存?
5 个解决方案
#1
操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。
#2
加上那两句会内存泄露,而且,free那里会有问题,不是自己分配的内存,就不要自己free
#3
pb = &pa->b;
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free
#4
//pb = (struct B *) malloc (sizeof(struct B));
pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
//free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错
别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。
pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
//free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错
别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。
#5
好吧,我说下我的理解:
环境:我用的ubuntu 12.04 gcc 4.6.1
问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。
我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found
出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。
环境:我用的ubuntu 12.04 gcc 4.6.1
问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。
我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found
出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。
#1
操作都是在pa申请的内存上进行的,pb是不需要分配内存的了。。
#2
加上那两句会内存泄露,而且,free那里会有问题,不是自己分配的内存,就不要自己free
#3
pb = &pa->b;
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free
在malloc a的时候,已经给b分配内存了,就不需要你自己分配,不是你自己分配的内存,就不用你free
#4
//pb = (struct B *) malloc (sizeof(struct B));
pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
//free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错
别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。
pb = &pa->b;
如果第一条语句没有被注释,那么此时pb指向你申请的一块空间
第二条语句将pb指向pa相关的一块空间,pb原有的数据被覆盖。此时之前你申请的那块空间你已经没有办法以任何方式访问,即内存泄露。
//free(pb);
此时,你试图释放的pb并没有指向你最初申请的那块空间,因此释放出错
别死记硬背“一个malloc对应一个free,指针不malloc不能使用”。虽然这些话本身都是正确的,但如果你不明白为什么,哪怕背上一万条禁令,你也一样能发明出第一万零一种错误来。
#5
好吧,我说下我的理解:
环境:我用的ubuntu 12.04 gcc 4.6.1
问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。
我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found
出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。
环境:我用的ubuntu 12.04 gcc 4.6.1
问题出在”free(pb);“这一句。在”pb = &pa->b;“这里,你已经将pb的指针更改为struct A中成员b的地址了,所以不能再将这个指针作为free的参数,因为这个指针不是由malloc申请来的。记得以前好像看过,free的参数必需同是由malloc或类似的函数申请内存时反回的指针。
另外”pb= (struct B *) malloc (sizeof(struct B));“这句,由于你修改了pb指针,这块申请的内存由于指针丢失已经没办法free了,产生了内存泄漏问题。
我单注释“free(pb);”这句时编译后执行,系统反回:
5 6
sh: 1: pause: not found
出现“sh: 1: pause: not found”这句的原因是我的系统中没有"pause"这个命令。