【问题标题】:Segmentation fault (core dumped) 4分段错误(核心转储) 4
【发布时间】:2016-02-14 22:14:47
【问题描述】:

使用 Ctrl+D 停止程序输入后,我不断收到错误 Segmentation fault(core dumped)。我一直在谷歌搜索这个错误并试图找出导致它的原因,但我似乎无法弄清楚。我已经尝试用谷歌搜索这个问题并查看了这个网站上的其他问题/答案,但我仍然无法弄清楚为什么我会收到错误。根据我的研究,我发现分段错误错误是由于尝试访问我无权访问的内存而引起的。我希望这是正确的。

我是 C++ 的新手,如果你们能给我任何帮助,我将不胜感激。

#include <iostream>
using namespace std;

#include "video.h"

int main() {

    const int MAX = 100;
    Video *video[MAX];  // up to 100 videos

    for(int l = 0; l < MAX; l++)
    {
        video[l] = NULL;
    }

    string title;
    string url;
    string desc;
    string sorting;
    float length;
    int rate;

    cout << "What sorting method would you like to use?" << endl;
    getline(cin, sorting);
    cout << "Enter the title, the URL, a comment, the length, and a rating for each video" << endl;

    while(getline(cin, title))
    {
        getline(cin, url);
        getline(cin, desc);
        cin >> length;
        cin >> rate;
        cin.ignore();
        for(int k=0; k < MAX; k++)
        {
            video[k] = new Video(title, url, desc, length, rate);
        }
    }


    video[MAX]->print();  // prints the new Video object

    delete[] video[MAX];

    return 0;
}

【问题讨论】:

  • video[MAX]-&gt;print() 没有意义,因为数组中没有 MAX 元素。你打算在这里做什么?

标签: c++ segmentation-fault


【解决方案1】:

您的代码中有几个问题:

1) delete[] 的错误用法。

首先,delete[] 应该只用于删除动态分配的数组。你的不是。

其次,即使视频一个动态分配的数组,删除它的正确方法应该是

delete[] video;

删除代码中视频的正确方法是遍历数组并删除每个视频:

for(int k=0; k < MAX; k++)
{
    delete video[k];
}

2) 数组最后一个元素的索引不正确。

video[MAX]->print();

应该是

video[MAX-1]->print();

第一个元素的索引为 0,第二个元素的索引为 1...所以最后一个 (MAX) 元素的索引为 MAX-1。

3) 最后,虽然不是分段错误的原因,但您可能不会在每次阅读一行时都尝试用相同的视频填充整个数组。但是,这就是代码的作用:)

【讨论】:

  • 解决你的第三个原因它不起作用,用相同的视频填充整个数组的原因是while循环中的for循环吗?将这个 for 循环移到 while 循环之外似乎并不能解决问题
【解决方案2】:

除了 Danra 已经指出的错误使用 delete 之外,您的数组

Video *video[MAX];

没有元素

video[MAX];

最后一个元素是

video[MAX-1];

因为 C++ 从 0 开始计数(正如您在 for 循环中所做的那样)。 所以

video[MAX]->print(); 

会失败。

【讨论】:

  • 解决了!非常感谢。哇:D
【解决方案3】:
delete[] video[MAX];

尝试对视频结尾之外的元素进行数组删除。

你的意思是:

delete video[MAX - 1];

或者你的意思不是

delete[] video;

同样,您可能想要查看

video[MAX]->print();  // prints the new Video object

这会尝试打印第 MAX+1 个视频,而不是最后一个视频或整个视频列表。

您还应该查看此循环:

    for(int k=0; k < MAX; k++)
    {
        video[k] = new Video(title, url, desc, length, rate);
    }

【讨论】:

    猜你喜欢
    • 2012-10-30
    • 2015-06-25
    • 2021-06-03
    相关资源
    最近更新 更多