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

有人可以帮我识别任何悬空指针(如果存在)并解释相同的问题吗?

4

2 回答 2

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]

因此,如果我们 free input[itr]result[count]将指向已释放的内存,因此是悬空的。

如果我们不释放input[itr]result[count]仍然会指向有效内存。

如果你想result[count]指向它自己的内存,你必须使用:

result[count] = malloc(inputItrSize);
memcpy(result[count], input[itr], inputItrSize);

注意 - 没有办法知道有多少内存input[itr]指向,所以你必须自己声明inputItrSize适当的大小。

于 2013-10-05T19:22:35.793 回答
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.

但是,如果在您释放 input() 和/或任何染色体之前,输入和染色体列表保持不变,那么您就没有悬空指针。

于 2013-10-05T19:41:35.093 回答