在我使用Ctrl+D停止我的程序的输入之后,我一直收到错误分割错误(核心转储)。我一直在谷歌上搜索这个错误,并试图找出导致它的原因,但我似乎找不到它。我已经尝试在谷歌上搜索这个问题,并查看了这个网站上的其他问题/答案,但我仍然无法弄清楚为什么会出现这个错误。从我的研究中,我发现分段错误是由于我试图访问我没有权限访问的内存而导致的。我希望这是对的。
我是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;
}
发布于 2016-02-15 06:19:54
代码中有几个问题:
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)最后,虽然不是分段错误的原因,但您可能不会在每次读取一行时都尝试用相同的视频填充整个数组。然而,这就是代码所做的:)
发布于 2016-02-15 06:22:35
除了Danra已经指出的delete的不正确用法之外,您的数组
Video *video[MAX];
没有元素
video[MAX];
最后一个元素是
video[MAX-1];
因为C++从0开始计数(正如您在for循环中所做的那样)。所以
video[MAX]->print();
都会失败。
发布于 2016-02-15 07:19:18
delete[] video[MAX];
尝试数组删除视频结尾以外的元素。
你的意思是:
delete video[MAX - 1];
或者你的意思是不是
delete[] video;
类似地,您可能希望查看
video[MAX]->print(); // prints the new Video object
这会尝试打印MAX+1th视频,而不是最后一个视频或整个视频列表。
您还应该查看此循环:
for(int k=0; k < MAX; k++)
{
video[k] = new Video(title, url, desc, length, rate);
}
https://stackoverflow.com/questions/35398662
复制相似问题