工作代码已修复及以下
这是整个.cpp。有没有想过为什么在调用重载void display(const Kingdom kingdoms[], size_t count)
函数时打印出纯垃圾?
File Kingdom.h
#ifndef KINGDOM_H
#define KINGDOM_H
#include <cstdlib>
// TODO: sict namespace
namespace sict
{
// TODO: define the structure Kingdom in the sict namespace
struct Kingdom {
char m_name[32];
int m_population;
};
// TODO: declare the function display(...),
// also in the sict namespace
void display(const Kingdom& pKingdom);
void display(const Kingdom kingdoms[], size_t count);
}
#endif
File Kingdom.cpp
#include <iostream>
#include <cstdlib>
#include "Kingdom.h"
using namespace std;
// TODO: the sict namespace
namespace sict
{
// TODO:definition for display(...)
void display(const Kingdom& pKingdom) {
cout << pKingdom.m_name << ", " << "population " << pKingdom.m_population << endl;
}
void display(const Kingdom kingdoms[], size_t count) {
cout << "------------------------------" << endl;
cout << "Kingdoms of SICT" << endl;
cout << "------------------------------" << endl;
int pop = 0;
for (size_t i = 0; i < count; i++) {
cout << i + 1 << ". ";
display(kingdoms[i]);
pop += kingdoms[i].m_population;
}
cout << "------------------------------" << endl;
cout << "Total population of SICT: " << pop << endl;
cout << "------------------------------";
}
}
File main.cpp
#include <iostream>
#include <cstring> //for size_t definition
#include <vector>
#include "Kingdom.h"
using namespace std;
using namespace sict;
void read(Kingdom&);
int main() {
int count = 0; // the number of kingdoms in the array
// TODO: declare the pKingdom pointer here (don't forget to initialize it)
Kingdom *pKingdom = nullptr;
cout << "==========\n"
<< "Input data\n"
<< "==========\n"
<< "Enter the number of Kingdoms: ";
cin >> count;
cin.ignore();
if (count < 1) return 1;
// TODO: allocate dynamic memory here for the pKingdom pointer
pKingdom = new Kingdom[count];
for (int i = 0; i < count; ++i) {
cout << "Kingdom #" << i + 1 << ": " << endl;
// TODO: add code to accept user input for Kingdom i
read(pKingdom[i]);
}
cout << "==========" << endl << endl;
// testing that "display(...)" works
cout << "------------------------------" << endl
<< "The 1st Kingdom entered is" << endl
<< "------------------------------" << endl;
display(pKingdom[0]);
cout << "------------------------------" << endl << endl;
// expand the array of Kingdoms by 1 element
count = count + 1;
Kingdom *cpy_pKingdom = nullptr;
// TODO: allocate dynamic memory for count + 1 Kingdoms
cpy_pKingdom = new Kingdom[count];
// TODO: copy elements from original array into this newly allocated array
for (int i = 0; i < count; i++) {
cpy_pKingdom[i] = pKingdom[i];
}
// TODO: deallocate the dynamic memory for the original array
delete[] pKingdom;
// TODO: copy the address of the newly allocated array into pKingdom pointer
pKingdom = cpy_pKingdom;
// add the new Kingdom
cout << "==========\n"
<< "Input data\n"
<< "==========\n";
cout << "Kingdom #" << count << ": " << endl;
// TODO: accept input for the new element in the array
read(pKingdom[count - 1]);
cout << "==========\n" << endl;
// testing that the overload of "display(...)" works
display(pKingdom, count);
cout << endl;
// TODO: deallocate the dynamic memory here
//delete[] pKingdom;
//delete[] cpy_pKingdom;
getchar();
return 0;
}
// read accepts data for a Kingdom from standard input
//
void read(Kingdom& pkingdom) {
cout << "Enter the name of the Kingdom: ";
cin.get(pkingdom.m_name, 32, '\n');
cin.ignore(2000, '\n');
cout << "Enter the number of people living in " << pkingdom.m_name << ": ";
cin >> pkingdom.m_population;
cin.ignore(2000, '\n');
答案 0 :(得分:0)
显而易见的违规行(可能还有其他行)
cpy_pKingdom = new Kingdom[count + 1];
cpy_pKingdom = pKingdom;
delete[] pKingdom;
pKingdom = cpy_pKingdom;
赋值cpy_pKingdom = pKingdom
是指针赋值,不复制任何数组。它还会丢弃新表达式的结果,这意味着cpy_pKingdom
和pKingdom
都具有pKingdom
的原始值。
delete [] pKingdom
然后释放pKingdom
指向的内存,这也是(由于前面的赋值cpy_pKingdom = pKingdom
)cpy_Kingdom
指向的内存。
这四行的净效果是new Kingom[count + 1]
被泄露(它被分配,从未被释放,但也无法访问),并且pKingdom
和cpy_pKingdom
都指向释放的内存
更糟糕的是,对pKingdom
执行任何操作的下一个语句是
read(pKingdom[count + 1]);
将文件中的数据读入不存在的pKingdom[count + 1]
。请记住 - 即使前面的代码使pKingdom
指向由new Kingdom[count + 1]
分配的内存 - 这将写入该内存的末尾。也是未定义的行为。
然后我们到达
display(pKingdom, count);
将访问相同的不存在的内存以打印出那里的数据。
在此处显示垃圾是代码中一个或多个前面未定义行为实例的次要结果。