You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++泛型排序类异常求助:类型无关排序功能失效

问题分析与修正方案

你的代码核心问题出在SortAll方法中错误地使用sizeof(ptr)计算数组长度——指针的sizeof结果是指针本身的字节数(如64位系统为8),而非数组元素个数,导致排序范围错误和越界输出。以下是修正后的完整代码:

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
 
template <typename T> 
class Array {
private:
    T* ptr;
    int size;
public:
    Array(T arr[], int s);
    void SortAll();
    void print();
};
 
template <typename T> 
Array<T>::Array(T arr[], int s) {
    ptr = new T[s];
    size = s;
    for (int i = 0; i < size; i++)
        ptr[i] = arr[i];
}
 
template <typename T> 
void Array<T>::SortAll() {
    // 直接使用类中存储的size变量,而非通过指针计算长度
    sort(ptr, ptr + size);
    
    // 循环条件改为i < size,避免越界访问内存
    for (int i = 0; i < size; i++)
        cout << " " << ptr[i];
    cout << endl;
}

template <typename T> 
void Array<T>::print() {
    for (int i = 0; i < size; i++)
        cout << " " << *(ptr + i);
    cout << endl;
}
 
int main() {
    int intArr[5] = { 3, 1, 2, 5, 4 };
    char charArr[5] = { 'd', 'b', 'a', 'c', 'e' };
    
    Array<int> intTestArray(intArr, 5);
    intTestArray.print();
    intTestArray.SortAll();

    Array<char> charTestArray(charArr, 5);
    charTestArray.print();
    charTestArray.SortAll();

    return 0;
}

关键修正点:

  • 替换sizeof(ptr) / sizeof(ptr[0])为类成员size:指针无法通过sizeof推导数组实际长度,类构造时已经存储了正确的数组大小,直接使用即可。
  • 修正输出循环的终止条件:将i < sizeof(ptr)改为i < size,避免访问数组边界外的内存,消除乱码输出。

修正后运行结果:

3 1 2 5 4
 1 2 3 4 5
 d b a c e
 a b c d e

内容的提问来源于stack exchange,提问作者MikaJuhani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 21:17:06