【发布时间】:2020-01-04 10:25:53
【问题描述】:
好的,所以我有这个关于 c++ 的作业问题并删除了一个动态数组。 当我运行程序时,它会显示以下内容:http://prntscr.com/p015e9 我想问题出在删除指针上,因为我将其追溯到这些行:
delete[] _elementi1; _elementi1 = nullptr;
delete[] _elementi2; _elementi2 = nullptr;
这是我的课,当我调用“Dodaj”函数时发生错误
template<class T1, class T2 = int>
class FITKolekcija {
T1 * _elementi1;
T2 * _elementi2;
int _trenutno;
public:
FITKolekcija() {
_elementi1 = nullptr; // Elements 1 pointer
_elementi2 = nullptr; // Elements 2 pointer
_trenutno = 0; // This is the _current variable and is used as an iterator
}
~FITKolekcija() {
try {
delete[] _elementi1; _elementi1 = nullptr;
delete[] _elementi2; _elementi2 = nullptr;
}
catch (exception& e) {
cout << e.what() << endl;
}
}
T1 * GetT1() { return _elementi1; }
T2 * GetT2() { return _elementi2; }
int GetTrenutno() { return _trenutno; }
friend ostream& operator<< (ostream &COUT, FITKolekcija &obj) {
for (size_t i = 0; i < obj._trenutno; i++)
COUT << obj._elementi1[i] << " " << obj._elementi2[i] << endl;
return COUT;
}
void Dodaj(T1 clan1, T2 clan2) {
T1 *temp1 = new T1[_trenutno + 1];
T2 *temp2 = new T2[_trenutno + 1];
for (size_t i = 0; i < _trenutno; i++) {
temp1[i] = _elementi1[i];
temp2[i] = _elementi2[i];
}
delete[] _elementi1; _elementi1 = nullptr; // Here lies the runtime error
delete[] _elementi2; _elementi2 = nullptr;
temp1[_trenutno] = clan1;
temp2[_trenutno] = clan2;
_elementi1 = temp1;
_elementi2 = temp2;
_trenutno++;
//
}
}
使用以下代码,我可以在运行时错误发生之前执行 7 次“Dodaj”:
int main() {
int v6 = 6, v13 = 13, v32 = 32, v63 = 63, v98 = 98, v109 = 109, v196 = 196;
FITKolekcija<int, int> numbers;
cout << "1" << endl;
numbers.Dodaj(v196, v6);
cout << "2" << endl;
numbers.Dodaj(v13, v32);
cout << "3" << endl;
numbers.Dodaj(v98, v196);
cout << "4" << endl;
numbers.Dodaj(v63, v13);
cout << "5" << endl;
numbers.Dodaj(v98, v196);
cout << "6" << endl;
numbers.Dodaj(v196, v6);
cout << "7" << endl;
return 0;
}
【问题讨论】:
-
你为什么要使用原始数组和指针? containers 和 dynamic memory management 可用于标准 c++。
-
在
Dodaj中,创建一个数组并将其指针存储在temp1中,然后分配成员指针_elementi1指向同一个数组,然后立即删除您创建的数组(这使得_elementi1成为悬空指针)。 -
@πάνταῥεῖ,正如我所说,这是一个家庭作业问题,我们必须纠正给定的程序才能工作。因此,我们必须使用原始指针。
-
@JFKay 恕我直言,你的老师教 c++ 的方式是错误的。
-
@Yksisarvinen 我不太明白。我不必删除指针位置的空间并将新空间分配给它,这样我就不会出现内存泄漏。你能提供一个关于你会怎么做的sn-p吗?我将不胜感激。我也更新了代码
标签: c++ class pointers templates