当您将内存分配给char* p
时,它在其指向的堆部分具有内存位置。
但是,一旦执行了以下行,它是否会指向数据部分的新内存位置并为其指定指针?
char* p = "newstring";
如果是这样,之后无法找到已分配的内存并将其释放?
答案 0 :(得分:3)
有例如。
char *p;
p = malloc(SOME_SIZE);
p = "some string";
相当于
int i;
i = 5;
i = 10;
当您将指针重新分配给其他位置时,您会丢失指针的原始值,它最初指向的位置。这将导致内存泄漏。
答案 1 :(得分:2)
简单的答案是否定的。一旦覆盖了指针的副本,就无法再将其取回。
实际上,内存管理器知道指针,但没有标准的方法来获取它。
答案 2 :(得分:0)
保留p
指针值的副本以释放它:
char * pp = p;
p = "newstring";
...
free( pp );
在新作业之前免费:
free( p ); // only if p is previously assigned with malloc()
p = "newstring";
答案 3 :(得分:0)
否导致指针的旧值永远丢失(除非您将其缓存在某处)。这会导致内存泄漏,内存被分配但未被任何活动指针引用。
int main() {
ios_base::sync_with_stdio(false);
char* p = (char*)malloc(sizeof(char)*100);
printf("%p\n",p);
p = "random string";
printf("%p\n",p);
return 0;
}
输出如下内容:
0x55592ed2cc80
0x55592da03f24
如果你需要释放指针,那么缓存你要覆盖的值。