找不到我的内存泄漏

问题描述:

2个问题:找不到我的内存泄漏

  1. 我的valgrind运行该程序的损失了大约400个字节,但我不知道我做错了什么。
  2. 由于某种原因,在学生对象(roster[i]int i = 0)的FIRST(也是唯一的第一个)初始化时,该循环只允许我将两个参数传递给我的构造函数。我知道这听起来很奇怪,但第一次循环调用与其他循环不同。

HEADER

#include<iostream> 
#include<string> 

using namespace std; 

class Student{ 

public: 
Student(); 
Student(string ln, string fn, string cn) {setLast(ln);setFirst(fn);setCourse(cn);} 
void showInfo(){cout << firstname << " " << lastname << " in " << coursename << endl;} 

protected: 
void setLast (string l){lastname = l;} 
void setFirst (string f){firstname = f;} 
void setCourse (string c){coursename = c;} 
string firstname; 
string lastname; 
string coursename; 
}; 

主要

int main(){ 

Student **roster; 
int num; 
cout << "how many?"; 
cin >> num; 
roster = new Student*[num]; 
string l,f,c; 

for (int i = 0; i < num; i++){ 
    cout << "\nenter last, first, course: "; 
    getline(cin, l); 
    getline(cin, f); 
    getline(cin, c); 
    roster[i] = new Student(l, f, c); 
    roster[i]->showInfo(); 
} 
delete [] roster; 
}; 
+3

对于'roster [i] = new Student(l,f,c);'对于每个'i'都没有相应的'delete'。 – DeiDei

+1

请不要使用C++,好像它是用有趣的新语法的C语言。使用'std :: vector >名册;',以及'roster.emplace_back(std :: make_unique (l,f,c));'你还应该测试你对'getline'的调用成功了。 – paddy

+0

@ n.m。这完全与问题无关。 –

的问题是,你是newing一个数组,你newing所有学生在数组中。你犯了一个new Student*[]和一些new Student,但只有delete[] arr你,你忘了delete x

修复之前,我想建议你使用矢量和的unique_ptr,这将对防止所有的错误摆在首位:

std::vector<std::unique_ptr<Student>> roster; 

int num; 
cout << "how many?"; 
cin >> num; 
roster.reserve(num); 

std::string l,f,c; 

for (int i = 0; i < num; i++){ 
    cout << "\nenter last, first, course: "; 
    getline(cin, l); 
    getline(cin, f); 
    getline(cin, c); 

    roster.emplace_back(std::make_unique<Student>(l, f, c)); 
    roster.back()->showInfo(); 
} 

现在,您的代码的解决方案。你应该把它写在代码末尾:

for (int i = 0; i < num; i++){ 
    delete roster[i]; 
} 
delete [] roster; 
+0

ahhhh我是一个白痴非常感谢 –