我的程序中是否有任何悬空指针?

时间:2013-10-05 18:52:55

标签: c pointers

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;
}

有人可以帮我识别任何悬空指针(如果有的话)并解释一下吗?

2 个答案:

答案 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()和/或任何染色体,你就没有悬空指针。