char** removeDuplicateChromosomes(char* input[], int no_of_chromosomes)
{
char** result = (char**) malloc(sizeof(char* )*(no_of_chromosomes));
//some piece of code
result[count] = input[itr];
//some piece of code . I didn't free any pointers here in this function
return result;
}
有人可以帮我识别任何悬空指针(如果有的话)并解释一下吗?
答案 0 :(得分:0)
内存泄漏 - 如果没有指针指向不同意的内存 悬空指针 - 指向释放内存的指针。
您的代码存在重大风险,或者两者兼而有之,但如果没有完整的代码示例,则无法确定是否会发生这两种情况。我会给出一些可能发生的情况。
作为初步说明,如果您没有在调用函数中释放result
的内存,则会出现内存泄漏。任何malloc
都必须有相应的free
。
如果你这样免费input
:
free(input);
不会有悬垂的指针。
但是如果input
的每个元素都没有指向同一内存的result
元素,则可能会出现内存泄漏。如果result
的多个元素指向此内存,当您尝试释放它时,您可能最终会得到一个悬空指针,以及一些未定义的行为。
如果你这样免费input
:
int i;
for (i = 0; i < inputSize; i++)
free(input[i]);
free(input);
会有一个悬垂的指针。
<强>为什么吗
input[itr];
是指针。
result[count] = input[itr];
只是让result[count]
指向与input[itr]
指向的内存相同的内存。
因此,如果我们释放input[itr]
,result[count]
将指向释放的内存,从而悬空。
如果我们没有免费input[itr]
,result[count]
仍会指向有效的内存。
如果您希望result[count]
指向自己的内存,则必须使用:
result[count] = malloc(inputItrSize);
memcpy(result[count], input[itr], inputItrSize);
注意 - 无法确定input[itr]
指向的内存量,因此您必须自己声明inputItrSize
适当的大小。
答案 1 :(得分:0)
悬空指针是指向不再分配的存储区的指针。
char* dangleMeBaby(char* obj) {
free(obj);
return obj;
}
int* localDangle() {
int i = 10;
return &i;
}
#define NUM_POINTERS 8
char** wholeLottaDangle() {
char* ptr = malloc(sizeof(char*) * NUM_POINTERS);
size_t i;
void* data = malloc(NUM_POINTERS);
for (i = 0; i < NUM_POINTERS; ++i) {
ptr[i] = data + i;
}
free(data); // all the pointers in ptr now dangle.
free(ptr); // and ptr itself is now a dangle
return ptr;
}
如果你已经将输入分配为指针+数据的一大块,那么在结果之前释放输入会将结果转换为悬空指针数组。
size_t indexSize = sizeof(char*) * numChromosomes;
size_t chromosomeSize = (MAX_CHROMOSOME_LEN) * numChromosomes;
char* data = malloc(indexSize + chromosomeSize);
char** input = (char**)data;
char* chromosome = data + indexSize;
for (size_t i = 0; i < numChromosomes; ++i, chromosome += MAX_CHROMOSOME_LEN) {
input[i] = chromosome;
}
// no dangling pointers in result until you free input.
如果您已单独分配染色体然后分配“输入”以容纳所有指针,那么释放染色体而不将其从“结果”中移除将导致悬垂指针
result = removeDuplicateChromosomes(input, 64);
free(input[0]); // result still points to it, result is dangling.
但是如果输入和chromos列表保持完整,直到你释放input()和/或任何染色体,你就没有悬空指针。