Visual Studio 警告 C6308 存在于缩小的动态数组中

Posted

技术标签:

【中文标题】Visual Studio 警告 C6308 存在于缩小的动态数组中【英文标题】:Visual studio warning C6308 exist in shrinking dynamic array 【发布时间】:2021-10-30 11:57:18 【问题描述】:

为什么我在缩小数组时收到警告? 没有任何方法可以丢失指针值。

警告 C6308 'realloc' 可能返回空指针:将空指针分配给作为参数传递给 'realloc' 的 'arr_all_guests' 将导致原始内存块泄漏。

arr_all_guests = (char**)realloc(arr_all_guests,--(*guest_counter) * sizeof(char*));

【问题讨论】:

正如消息所说,realloc 可能会返回一个空指针。您对此没有任何检查 realloc 的调用可能 可能会失败(即使您正在缩小块)。编译器通过警告您来履行职责。 如果事先*guest_counter == 0,这肯定不是缩小分配。 【参考方案1】:

这意味着函数realloc可以返回一个空指针。在这种情况下,对所有早期分配的内存的访问将丢失

arr_all_guests = (char**)realloc(arr_all_guests,--(*guest_counter) * sizeof(char*)); 

因为原来的指针arr_all_guests会被重新分配一个空指针。

例如你需要使用一个临时指针

char **tmp = realloc(arr_all_guests, ( *guest_counter - 1 ) * sizeof(char*)); 
if ( tmp != NULL ) 

    arr_all_guests = tmp;
    --*guest_counter;

【讨论】:

感谢您的快速回复。但我想我没有清楚地解释自己。在制作更小的动态数组时,不会丢失数据,因为函数的机制会按照我的请求释放单元格并返回指向与指针指向完全​​相同的位置的指针。 NULL 返回只能发生在一种情况下(在某些 C 版本中):将数组减小到 0。 @Moshe 函数 realloc 的工作方式如下。起初,它尝试分配一个新的内存范围。该函数没有必要尝试重新分配(调整大小)先前分配的内存范围。如果新范围的分配成功,则该函数将元素从旧范围复制到新范围,然后释放旧范围的内存。否则该函数返回一个空指针。

以上是关于Visual Studio 警告 C6308 存在于缩小的动态数组中的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 中的“将所有警告视为错误,除了...”

仅在 Visual Studio 中报告 C 警告

Visual Studio 中的 C4275 警告

Visual Studio中的警告C6385

Visual Studio 警告级别的含义?

Visual Studio 警告 C4100 和 TRACE