数组新长度错误错误未处理异常

Bad array new length error unhandled exception

提问人:Neteroh 提问时间:7/8/2020 最后编辑:brunoNeteroh 更新时间:7/8/2020 访问量:1206

问:

我不确定我哪里出了问题。

我有一个 Movie.h,其中包含所需的所有数据成员和构造函数、析构函数和复制构造函数,但我有一种感觉,它在我的赋值运算符上失败了,有人,请帮忙

  Movie& Movie::operator=(const Movie& _assign) {
    // Self-assignment check
    if (this == &_assign)
        return *this;

    // Shallow copy non-dynamic data members
    mRuntime = _assign.mRuntime;

    // Deep copy appropriate data members
    mTitle = new char[strlen(_assign.mTitle) + 1];
    strcpy_s(mTitle, strlen(_assign.mTitle) + 1, _assign.mTitle);

    // Deep copy the reviews
    SetStars(_assign.mStars, mNumReviews);

    return *this;
  }

  void Movie::SetStars(const int* _stars, int _numReviews) {
    
    // Allocate array and deep copy
    mStars = new int[_numReviews];

    for (int i = 0; i <= _numReviews; ++i) {
        // Cap reviews between 1-10
        if (_stars[i] > 10)
        {
            mStars[i] = 10;
        }
        else if (_stars[i] < 0)
        {
            mStars[i] = 0;
        }
        else
        {
            mStars[i] = _stars[i];
        }
    }

    // Set the number of reviews
    mNumReviews = _numReviews;
  }
C++ 数组赋 值运算符 未处理异常

评论

2赞 David C. Rankin 7/8/2020
你为什么要用而不是?char*std::string
0赞 user4581301 7/8/2020
不相关:并且可能泄露了预先存在的分配。强制性链接 ot 什么是复制和交换成语?复制和交换并不总是最好的解决方案,但几乎不可能出错,这是一个很好的起点。分析代码会让你知道你是否需要更有效的东西。mTitlemStars
0赞 MPops 7/8/2020
您想告诉我们您的程序崩溃了哪一行代码?您想告诉我们确切的实际错误消息是什么吗?从字面上看,复制和粘贴错误比用更少的单词来解释它更容易。
0赞 Neteroh 7/8/2020
不,我希望有人告诉我为什么我收到错误是哪一行导致麻烦的
0赞 MPops 7/8/2020
@Neteroh,请发布整个错误消息。如果您坚持不使用调试器,请在程序中的每一行上放置一些语句,并告诉我们您的程序会崩溃。这被称为“打印调试”,通常不受欢迎,因为它需要大量的程序修改。或者,可以使用调试器。coutcout

答:

3赞 bhristov 7/8/2020 #1

问题发生在这里:

mStars = new int[_numReviews];


for (int i = 0; i <= _numReviews; ++i) {

具体来说:

i <= _numReview // this causes you to go out of bounds

将其更改为:

i < _numReview

解决了问题

您正在分配项目。C++ 具有从 0 开始的数组索引。元素将从_numReview0_numReview - 1

请考虑使用 和 代替 c 样式数组。std::stringstd::vector

评论

0赞 bhristov 7/8/2020
@Neteroh,如果使用 std::string 而不是 char 数组会更好。我怀疑这条线导致了问题:现在。strcpy_s(mTitle, strlen(_assign.mTitle) + 1, _assign.mTitle);
0赞 Neteroh 7/8/2020
我不能,这是为了一个我不允许改变的作业,相信我,我宁愿使用字符串而不是数组
1赞 user4581301 7/8/2020
@Neteroh 在开发环境附带的调试器中运行程序。一个像样的调试器会在程序崩溃后立即停止,并允许您检查崩溃现场和导致崩溃的回溯。这将为您提供缩小原因范围所需的信息,如果不能彻底解决它。