繁体   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