我正在慢慢掌握指针的窍门。但是我还有一些问题。
使用指针算术时是否可能导致内存泄漏,因为您正在移动指针指向的实际位置?
我的意思是,如果说我向上计数以逐个字符地复制字符串,我是否需要倒数以便 C“知道”指针曾经指向的位置?
谢谢弗兰克
我正在慢慢掌握指针的窍门。但是我还有一些问题。
使用指针算术时是否可能导致内存泄漏,因为您正在移动指针指向的实际位置?
我的意思是,如果说我向上计数以逐个字符地复制字符串,我是否需要倒数以便 C“知道”指针曾经指向的位置?
谢谢弗兰克
使用malloc()
或类似功能时可能会发生内存泄漏,而不是在需要时调用free()
。free()
应该总是用返回的指针调用malloc()
,所以如果你这样做是可以的:
int* ptr = malloc(sizeof(int));
free(ptr + 1);
导致未定义的行为。可能是内存泄漏,也可能是分段错误,一切皆有可能。
内存是在堆上分配的。指针就是这样,指向内存中位置的指针。您需要知道分配内存的起始地址,以便稍后释放它。
这是因为内存管理系统需要记住有关已分配内存的信息(例如分配了多少),以便它知道以后要释放多少,并防止它将相同的块分配给另一个 malloc 调用。内存的起始地址是它的标识。
如果您想摆弄指针,请将其复制并不要修改原始指针。
int *x = malloc(...);
int *y = x;
... pointer arithmetic with y
free(x);
动态内存分配会发生内存泄漏。如果您存储指向已分配的堆段的指针,然后修改该指针引用,那么您可能无法释放先前分配的内存。
您应该使用另一个指针,并保留对分配内存的初始引用。例如:
char *pointer = (char*)malloc (SIZE); /*alloc space for storing a string of size SIZE*/
char *pointer2 = pointer;
int i;
for (i = 0 ; i < SIZE ; i++){
pointer2 += 1;
//you are modifying the second pointer so you always keep a reference to the allocated memory(pointer)
}
//now you can call free on your memory
free(pointer);
您可以使用指针算法创建内存泄漏,方法是让指针指向错误的位置,这样就不再有对您指向的内存块的任何引用。
无论指向的数据是使用 malloc() 分配还是静态分配,这都是内存泄漏。然而,使用 malloc() 的动态内存泄漏是危险的,而静态内存泄漏是无害的。
请注意,指向数组外部是未定义的行为:任何事情都可能发生。对指向不同数组的指针进行指针运算也是未定义的行为。
未定义行为的一些示例:
typedef struct
{
char array1 [6] = "hello";
char array2 [6] = "world";
} HelloWorld_t;
HelloWorld_t hw;
const char* ptr = hw.array1;
ptr += 6; /* undefined behavior, out of bounds of the original array */
puts(ptr); /* anything can happen here: the program may crash */
puts(array2 - 6); /* also undefined behavior */