我正在学校项目,需要使用动态分配的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;
}
}
每当它到达&#34;删除[] tempName&#34;程序会崩溃,这可能是编译器优化的副作用吗?
编辑:
我不确定在不添加太多内容的情况下我应该包含多少代码但是这里的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;
组类有一个处理newGroup的析构函数。
再次编辑:
好的,我已经弄明白但我不明白为什么?在包含以下内容的行上:
char *tempName = new char[strlen(tempString + 1)];
我已将其更改为:
char *tempName = new char[strlen(tempString) + 1];
我在哪里拍摄&#34; 1&#34;超出strlen()括号。
为什么会有所作为?这里发生了什么?
答案 0 :(得分:2)
显然不是因为delete[]
。您需要进入setPromo
。最后你错过了函数末尾的delete newGroup;
。
&#34; dgsomerton&#34;提出了一个很好的观点:
char *tempName = new char[strlen(tempString + 1)];
这实际上导致两个字节少于所需和缓冲区溢出。随机错误并不令人意外。修复:
char *tempName = new char[strlen(tempString)+1];
这就是为什么我更喜欢std::string
而不是char*
。