c++ - 删除动态 cstring 时程序崩溃
问题描述
我正在开展一个需要使用动态分配的 cstrings 的学校项目。在我的代码中,我有一个临时的 cstring,但每当我尝试删除它时它就会崩溃。
这是我的代码:
#include "group.h"
#include <iostream>
using namespace std;
void addGroup()
{
group *newGroup = new group;
char tempString[ARRAY_CONST];
cin >> option;
cin.ignore(100, '\n');
if (option == 'Y' || option == 'y')
{
cout << "Enter name: ";
cin.getline(tempString, ARRAY_CONST, '\n');
char *tempName = new char[strlen(tempString + 1)];
strcpy(tempName, tempString);
cout << "Enter email: ";
cin.getline(tempString, ARRAY_CONST, '\n');
newGroup->setPromo(true, tempName, tempString);
delete[] tempName;
}
}
每当它到达“delete[] tempName”时,程序就会崩溃,这可能是编译器优化的副作用吗?
编辑:
我不确定在不添加太多代码的情况下应该包含多少代码,但这里是 setPromo():
bool group::setPromo(bool enroll, const char *name, const char *email)
{
promo.enrolled = enroll;
if (promo.name)
delete[] promo.name;
promo.name = new char[strlen(name) + 1];
strcpy(promo.name, name);
if (promo.email)
delete[] promo.email;
promo.email = new char[strlen(email) + 1];
strcpy(promo.email, email);
return true;
}
该组类具有私有数据成员,如下所示:
struct promotion
{
bool enrolled;
char *name;
char *email;
} promo;
group 类有一个处理 newGroup 的析构函数。
再次编辑:
好的,我已经弄清楚了,但我不明白为什么?在包含以下内容的行上:
char *tempName = new char[strlen(tempString + 1)];
我已将其更改为:
char *tempName = new char[strlen(tempString) + 1];
我从 strlen() 括号中取出“1”。
为什么会有所作为?这里发生了什么?
解决方案
显然不是因为delete[]
。你需要踏入setPromo
。最后你错过了delete newGroup;
函数末尾的。“dgsomerton”提出了一个很好的观点:
char *tempName = new char[strlen(tempString + 1)];
这实际上导致比需要的少两个字节和缓冲区溢出。随机错误并不奇怪。修复到:
char *tempName = new char[strlen(tempString)+1];
这就是为什么我更std::string
喜欢char*
.
推荐阅读
- java - 在处理上制作游戏“落块”的问题
- python - Sencha ExtJS PDF 下载
- firebase - 单击后如何在按钮下显示文本?
- php - 编码未正确保存到数据库
- c# - Dynamic appsettings for Serilog.Sink.Mail
- python - 芥末 S3 禁止 boto3 upload_file() 403
- ruby-on-rails - Display Rails 6 show view as embed shopify page
- javascript - Trying to recreate this semi circle
- xpath - Get element if other element contains text
- azure-ad-b2c - Determine, if a user has been authenticated using id_token_hint