首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >分段故障(核心转储)4

分段故障(核心转储)4
EN

Stack Overflow用户
提问于 2016-02-15 06:14:48
回答 3查看 127关注 0票数 0

在我使用Ctrl+D停止我的程序的输入之后,我一直收到错误分割错误(核心转储)。我一直在谷歌上搜索这个错误,并试图找出导致它的原因,但我似乎找不到它。我已经尝试在谷歌上搜索这个问题,并查看了这个网站上的其他问题/答案,但我仍然无法弄清楚为什么会出现这个错误。从我的研究中,我发现分段错误是由于我试图访问我没有权限访问的内存而导致的。我希望这是对的。

我是C++的新手,非常感谢你们能给我的任何帮助。

代码语言:javascript
运行
复制
#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;
}
EN

回答 3

Stack Overflow用户

发布于 2016-02-15 06:19:54

代码中有几个问题:

1) delete[]用法不正确。

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

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

代码语言:javascript
运行
复制
delete[] video;

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

代码语言:javascript
运行
复制
for(int k=0; k < MAX; k++)
{
    delete video[k];
}

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

代码语言:javascript
运行
复制
video[MAX]->print();

应该是

代码语言:javascript
运行
复制
video[MAX-1]->print();

第一个元素在索引0,第二个元素在索引1…因此,最后一个(MAX)元素位于索引MAX-1处。

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

票数 1
EN

Stack Overflow用户

发布于 2016-02-15 06:22:35

除了Danra已经指出的delete的不正确用法之外,您的数组

代码语言:javascript
运行
复制
Video *video[MAX];

没有元素

代码语言:javascript
运行
复制
video[MAX];

最后一个元素是

代码语言:javascript
运行
复制
video[MAX-1];

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

代码语言:javascript
运行
复制
video[MAX]->print(); 

都会失败。

票数 0
EN

Stack Overflow用户

发布于 2016-02-15 07:19:18

代码语言:javascript
运行
复制
delete[] video[MAX];

尝试数组删除视频结尾以外的元素。

你的意思是:

代码语言:javascript
运行
复制
delete video[MAX - 1];

或者你的意思是不是

代码语言:javascript
运行
复制
delete[] video;

类似地,您可能希望查看

代码语言:javascript
运行
复制
video[MAX]->print();  // prints the new Video object

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

您还应该查看此循环:

代码语言:javascript
运行
复制
    for(int k=0; k < MAX; k++)
    {
        video[k] = new Video(title, url, desc, length, rate);
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35398662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档