C++ 中的 Malloc 错误?
Malloc error in c++?
我正在为 class 做一个项目,我相信我的框架是正确的。好吧,除了它不起作用的事实。通常有语法或逻辑错误,我可以查明我搞砸的地方,但这次我完全迷路了,我不知道如何解决这个问题。这是它向我抛出的内容:
DELETE
DELETE
heapOfStudents(642,0x7fff74944300) malloc: *** error for object 0x7fd2d2803208: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
是的,我不知道我做了什么。不过我好像发动了陷阱卡什么的。不管怎样,你们可能都需要看我的代码,就在这里。
//main.cpp
#include <string>
#include <iostream>
#include <fstream>
#include "student.h"
#include "address.h"
#include "date.h"
using namespace std;
int main(){
Student *S = new Student[50];
ifstream inFile;
inFile.open("data.dat");
string lines[51];
string item;
int x = 0;
while(!inFile.eof()){
getline(inFile, item);
if(item != ""){
lines[x] = item;
x++;
}
}
for (int i = 0; i < 51; i++){
string line = lines[i];
string delimiter = ",";
size_t pos = 0;
string sub;
x = 0;
while((pos = line.find(delimiter)) != string::npos){
sub = line.substr(0, pos);
line.erase(0, pos + delimiter.length());
if(x == 0){
S[i].setLName(sub);
}else if(x == 1){
S[i].setFName(sub);
}else if(x == 2 || x == 3 || x == 4 || x == 5 || x == 6){
S[i].setAddressInfo(sub, x - 2);
}else if(x == 7 || x == 8){
S[i].setDate(sub, x - 7);
}else if(x == 9){
S[i].setGPA(sub);
}else{
S[i].setCredHours(line);
}
x++;
delete S;
}
}
inFile.close();
return 0;
}
这里是 Student.cpp
//student.cpp
#include <string>
#include <iostream>
#include "student.h"
using namespace std;
Student::Student(){
}
void Student::setFName(string fName){
Student::fName = fName;
}
void Student::setLName(string lName){
Student::lName = lName;
}
void Student::setGPA(string GPA){
Student::GPA = GPA;
}
void Student::setCredHours(string credHours){
Student::credHours = credHours;
}
void Student::setAddressInfo(string info, int part){
if(part == 0){
Student::home.setAddress1(info);
}else if(part == 1){
Student::home.setAddress2(info);
}else if(part == 2){
Student::home.setCity(info);
}else if(part == 3){
Student::home.setState(info);
}else if(part == 4){
Student::home.setZip(info);
}
}
void Student::setDate(string info, int part){
if(part == 0){
Student::dateOfBirth.setDate(info);
}else if(part == 2){
Student::dateOfComp.setDate(info);
}
}
string Student::getFName(){
return Student::fName;
}
string Student::getLName(){
return Student::lName;
}
string Student::getGPA(){
return Student::GPA;
}
string Student::getCredHours(){
return Student::credHours;
}
void Student::reportStudent(){
}
void Student::unsortedPrint(){
}
Student::~Student(){
cout << "DELETE" << endl;
}
如果您需要查看我的另外两个文件,请向我打招呼。任何帮助都是很好的,因为我只是被困在这个障碍上。
谢谢!
您不仅从不在动态数组 S
中存储信息,而且您似乎 delete S
但它从未存储过任何数据。
此外,你必须使用delete[] S
除非你只想释放第一个内存地址的内容。
您的代码中有两个问题。首先,您分配一个数组 (S = new Student[50]
),但由于它不是数组而将其释放(delete S
而不是 delete[] S
)。如果你用 new[]
分配了一些东西,你必须用 delete[]
.
删除它
其次,你delete
在一个循环中。如果你分配一次东西,你应该只删除一次。将 delete S
移动到下方两行,就在 inFile.close()
之前,并将其替换为 delete[] S
,它应该可以正常工作。
编辑:代码中的另一个问题与您看到的错误无关,即您分配了 50 个元素 (= new Student[50]
),但访问了 51 个 (i < 51
)。要么分配 51 个元素,要么将循环更改为仅进行 50 次迭代。
我正在为 class 做一个项目,我相信我的框架是正确的。好吧,除了它不起作用的事实。通常有语法或逻辑错误,我可以查明我搞砸的地方,但这次我完全迷路了,我不知道如何解决这个问题。这是它向我抛出的内容:
DELETE
DELETE
heapOfStudents(642,0x7fff74944300) malloc: *** error for object 0x7fd2d2803208: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
Abort trap: 6
是的,我不知道我做了什么。不过我好像发动了陷阱卡什么的。不管怎样,你们可能都需要看我的代码,就在这里。
//main.cpp
#include <string>
#include <iostream>
#include <fstream>
#include "student.h"
#include "address.h"
#include "date.h"
using namespace std;
int main(){
Student *S = new Student[50];
ifstream inFile;
inFile.open("data.dat");
string lines[51];
string item;
int x = 0;
while(!inFile.eof()){
getline(inFile, item);
if(item != ""){
lines[x] = item;
x++;
}
}
for (int i = 0; i < 51; i++){
string line = lines[i];
string delimiter = ",";
size_t pos = 0;
string sub;
x = 0;
while((pos = line.find(delimiter)) != string::npos){
sub = line.substr(0, pos);
line.erase(0, pos + delimiter.length());
if(x == 0){
S[i].setLName(sub);
}else if(x == 1){
S[i].setFName(sub);
}else if(x == 2 || x == 3 || x == 4 || x == 5 || x == 6){
S[i].setAddressInfo(sub, x - 2);
}else if(x == 7 || x == 8){
S[i].setDate(sub, x - 7);
}else if(x == 9){
S[i].setGPA(sub);
}else{
S[i].setCredHours(line);
}
x++;
delete S;
}
}
inFile.close();
return 0;
}
这里是 Student.cpp
//student.cpp
#include <string>
#include <iostream>
#include "student.h"
using namespace std;
Student::Student(){
}
void Student::setFName(string fName){
Student::fName = fName;
}
void Student::setLName(string lName){
Student::lName = lName;
}
void Student::setGPA(string GPA){
Student::GPA = GPA;
}
void Student::setCredHours(string credHours){
Student::credHours = credHours;
}
void Student::setAddressInfo(string info, int part){
if(part == 0){
Student::home.setAddress1(info);
}else if(part == 1){
Student::home.setAddress2(info);
}else if(part == 2){
Student::home.setCity(info);
}else if(part == 3){
Student::home.setState(info);
}else if(part == 4){
Student::home.setZip(info);
}
}
void Student::setDate(string info, int part){
if(part == 0){
Student::dateOfBirth.setDate(info);
}else if(part == 2){
Student::dateOfComp.setDate(info);
}
}
string Student::getFName(){
return Student::fName;
}
string Student::getLName(){
return Student::lName;
}
string Student::getGPA(){
return Student::GPA;
}
string Student::getCredHours(){
return Student::credHours;
}
void Student::reportStudent(){
}
void Student::unsortedPrint(){
}
Student::~Student(){
cout << "DELETE" << endl;
}
如果您需要查看我的另外两个文件,请向我打招呼。任何帮助都是很好的,因为我只是被困在这个障碍上。
谢谢!
您不仅从不在动态数组 S
中存储信息,而且您似乎 delete S
但它从未存储过任何数据。
此外,你必须使用delete[] S
除非你只想释放第一个内存地址的内容。
您的代码中有两个问题。首先,您分配一个数组 (S = new Student[50]
),但由于它不是数组而将其释放(delete S
而不是 delete[] S
)。如果你用 new[]
分配了一些东西,你必须用 delete[]
.
其次,你delete
在一个循环中。如果你分配一次东西,你应该只删除一次。将 delete S
移动到下方两行,就在 inFile.close()
之前,并将其替换为 delete[] S
,它应该可以正常工作。
编辑:代码中的另一个问题与您看到的错误无关,即您分配了 50 个元素 (= new Student[50]
),但访问了 51 个 (i < 51
)。要么分配 51 个元素,要么将循环更改为仅进行 50 次迭代。