【发布时间】:2018-11-13 18:04:39
【问题描述】:
我不知道,这个错误有问题。但是,我认为我应该在删除[]cpp 之前删除uName[]。我该怎么做?
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string.h>
using namespace std;
class cppUr
{
public:
void writeName(char nm[]);
char * readName();
private:
char uName[80];
};
void cppUr::writeName(char nm[])
{
strncpy(uName, nm, 79);
}
char * cppUr::readName()
{
return uName;
}
主要是:
int main()
{
char name0[100];
char name1[100];
char name2[100];
char name3[100];
cppUr *cpp = new cppUr[3];
cout << "Input first name: "<<endl;
cin.getline(name0, 100);
cpp[0].writeName(name0);
cout << "Input second name: " << endl;
cin.getline(name1, 100);
cpp[1].writeName(name1);
cout << "Input third name: " << endl;
cin.getline(name2, 100);
cpp[2].writeName(name2);
cout << "Input fourth name: " << endl;
cin.getline(name3, 100);
cpp[3].writeName(name3);
for (int i = 0; i < 4; i++)
{
cpp[i].readName();
cout << "The "<<i<<" name " << cpp[i].readName() << endl;
}
delete[] cpp;
system("PAUSE");
return 0;
}
错误是:
检测到堆损坏:在 0x0059E1E0 的正常块 (#148) 之后。 CRT 检测到应用程序在堆缓冲区结束后写入内存
【问题讨论】:
-
你分配了 3 个
cppUr,然后使用了 4 个。 -
你应该永远删除
uName。它是静态分配的,而不是动态分配的。也没有理由动态分配cpp,如果你正在学习C++,你应该使用std::string而不是所有char[]、char*、strncpy和手动动态内存管理。 -
如果使用
std::string而不是 C 风格的字符串会更简单。 -
请注意,对于“安全”的任何合理定义,
strncpy不是“安全”替代strcpy。仔细阅读其documentation。