簡體   English   中英

VS2019:[C6386][C6001] 修改計數排序的警告

[英]VS2019: [C6386][C6001] warnings on modified counting sort

#include <iostream>
#include <string>
#include <vector>
using namespace std;

void MCounting_Sort(vector<int>& A)
{
const int size = A.size();

int min = A[0];
for (int i = 1; i < size; i++)
    if (A[i] < min)
        min = A[i];

for (int i = 0; i < size; i++)
    A[i] = A[i] - min;

int max = A[0];
for (int i = 1; i < size; i++)
    if (A[i] > max)
        max = A[i];

int* C = new int[max + 1]{ 0 };
for (int i = 0; i < size; i++)
    C[A[i]] = C[A[i]] + 1;

int* B = new int[size];
int pos = 0;
for (int i = 0; i < max + 1; i++)
    if (C[i] > 0)
        for (int j = 0; j < C[i]; j++)
            B[pos++] = i;   // <-- C6386 Buffer overrun...
        
for (int i = 0; i < size; i++)
    A[i] = B[i] + min;   // <-- C6001 Using uninitialized memory "B"

delete[] B;
delete[] C;
}

int main()
{
vector<int> A {7,2,18,5};
for(unsigned int i=0; i<A.size(); i++) cout<<A[i]<<" ";
cout<<endl;
MCounting_Sort(A);
for(unsigned int i=0; i<A.size(); i++) cout<<A[i]<<" ";
}

output:

7 2 18 5 
2 5 7 18 

排序算法有效(也適用於負數),但我收到這兩個警告,我不確定是否可以修復它們,因為算法本身可能不好,但它是學校作業。 也許我確實寫錯了。

正如其他人在對您的問題的評論中所說的那樣,如果您避免使用“原始”指針並使用 STL 提供的容器,您的代碼會好得多。

然而,碰巧的是,MSVC 給出的兩個警告可以很容易地通過對單行代碼的“微不足道”的修改來解決。

您可以簡單地將初始化列表添加到B數據的分配中(就像您對C所做的那樣)並確保在該數組中分配至少2 個整數。 后者通常可以在new調用的[]中使用類似std::max(size, 2)的表達式來實現; 但是,由於您定義了一個名為max的局部變量,因此您不能使用該 function。

相反,您可以更改此行:

int* B = new int[size];

對此:

int* B = new int[size < 2 ? 2 : size] { 0 }; // Ensure at least 2 elements and initialize

作為旁注,您可能想閱讀以下內容:為什么“使用命名空間標准;” 被認為是不好的做法? 因為,如果你替換你的using namespace std; 針對您實際使用的那些 STL 元素的單個using語句一致,那么您可以同時擁有一個名為max的局部變量new調用中使用std::max(size, 2)表達式。

以下三行將作為合適的替代品:

using std::vector;
using std::cout;
using std::endl;

或者,如果您的編譯器符合 C++17(或更高版本)標准,您可以將所有三個放在一個語句中:

using std::vector, std::cout, std::endl;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM