程序在删除[C]*后在C++中卡住 我在C++中为一个项目编写了一个面向对象的代码,在删除一个我创建的类字符串的char字段时,我在析构函数中遇到了一个问题,我需要使用char *,不能用这个任务的STD::string替换它。当我试图初始化一个新对象时,问题就出现了。 这是字符串类代码: // default C'tor String::String() { str = new char('\0'); } /// <summary> /// C'tor which gets a string and copies it to the objects string while removing unnecessary whitespaces /// </summary> /// <param name="str">: string to copy</param> String::String(char* str) { this->str = new char('\0'); int i = 0; str = strtok(str, " \t"); while (str) { if (i != 0) strcat(this->str, " "); strcat(this->str, str); str = strtok(NULL, " \t"); i++; } } // Copy C'tor String::String(const String& str_obj) { str = new char; *str = *(str_obj.str); } // D'tor String::~String() { delete[] str; // after debugging i found the after this specific line the program stops (but // doesn't crash or exits just doesn't go further in the code) str = NULL; } // overriding the assignment operator String& String::operator=(const String& str_obj) { delete[] str; str = new char[strlen(str_obj.str) + 1]; memset(str, '-',strlen(str_obj.str)); strcpy(this->str, str_obj.str); return *this; }
以下是我尝试创建新对象的方式:程序在删除[C]*后在C++中卡住 我在C++中为一个项目编写了一个面向对象的代码,在删除一个我创建的类字符串的char字段时,我在析构函数中遇到了一个问题,我需要使用char *,不能用这个任务的STD::string替换它。当我试图初始化一个新对象时,问题就出现了。 这是字符串类代码: // default C'tor String::String() { str = new char('\0'); } /// <summary> /// C'tor which gets a string and copies it to the objects string while removing unnecessary whitespaces /// </summary> /// <param name="str">: string to copy</param> String::String(char* str) { this->str = new char('\0'); int i = 0; str = strtok(str, " \t"); while (str) { if (i != 0) strcat(this->str, " "); strcat(this->str, str); str = strtok(NULL, " \t"); i++; } } // Copy C'tor String::String(const String& str_obj) { str = new char; *str = *(str_obj.str); } // D'tor String::~String() { delete[] str; // after debugging i found the after this specific line the program stops (but // doesn't crash or exits just doesn't go further in the code) str = NULL; } // overriding the assignment operator String& String::operator=(const String& str_obj) { delete[] str; str = new char[strlen(str_obj.str) + 1]; memset(str, '-',strlen(str_obj.str)); strcpy(this->str, str_obj.str); return *this; },c++,class,oop,C++,Class,Oop,以下是我尝试创建新对象的方式: // this is part of my main file #include "String.h" cout << "Please enter clients' id: "; cin.ignore(); getline(cin, input); temp_str = new char[input.length() + 1]; strcpy(temp_str, input.c_str()); id = Str
// this is part of my main file
#include "String.h"
cout << "Please enter clients' id: ";
cin.ignore();
getline(cin, input);
temp_str = new char[input.length() + 1];
strcpy(temp_str, input.c_str());
id = String(temp_str); // after this line the program stops continuing
delete[] temp_str;
cout << endl;
我不知道为什么会发生这种情况,希望有人能帮我修复它在我添加了编译所需的部分后,它运行正常。我使用MingW7.4在代码块17.12中进行了测试。请尝试以下代码。我想知道结果会是什么。我只删除了'cin.ignor',它删除了输入字符串中的第一个字符
#ifndef Class_String__
#define Class_String__
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
// Class_String__
struct String
{
char *str;
String();
String(char* str);
String(const String& str_obj);
~String();
String& operator=(const String& str_obj);
};
String::String() {
str = new char('\0');
}
/// <summary>
/// <param name="str">: string to copy</param>
String::String(char* str) {
this->str = new char ('\0');
int i = 0;
str = strtok(str, " \t");
while (str != NULL) {
if (i != 0) strcat(this->str, " ");
strcat(this->str, str);
str = strtok(NULL, " \t");
i++;
}
}
// Copy C'tor
String::String(const String& str_obj) {
str = new char;
*str = *(str_obj.str);
}
// D'tor
String::~String() {
delete[] str;
str = NULL;
}
//overriding the assignment operator
String& String::operator=(const String& str_obj) {
delete[] str;
str = new char[strlen(str_obj.str) + 1];
memset(str, '-',strlen(str_obj.str));
strcpy(this->str, str_obj.str);
return *this;
}
#endif
//
int main()
{
std::string input;
String id;
char *temp_str;
cout << "Please enter clients' id: ";
//cin.ignore();
getline(cin, input);
temp_str = new char[input.length() + 1];
strcpy(temp_str, input.c_str());
id = String(temp_str); // after this line the program stops continuing
delete[] temp_str;
cout << id.str << endl;
}
str=新字符*str=*str_obj.str;这不是在做你认为的事情。此->str=新字符'\0';str=strtokstr\t;这几乎肯定是写得太离谱了。您需要回顾内存分配应该如何工作。如果可能,我建议您完全避免使用指针;str=新字符;str=新字符'\0';您只为一个空终止符分配空间,仅此而已。如果它只能包含一个空字符串,那么它将不是一个有用的字符串类;删除[]str;不匹配。您的类似乎缺少长度成员变量。如果您有,那么您就不需要对strlen进行过多的调用。对strlen的每次调用都必须从字符串的开头开始,并计算字符数,直到到达空终止符为止。无缘无故地反复这样做会使代码速度过慢。它对[您]来说运行正常,因为这里有一大堆未定义的行为。仅仅说它运行find for me对OP来说并没有真正的用处,而且也不能回答问题。即使在您使用的设置中发生了这种情况,使用常规new而不是new[]分配内存,然后使用delete[]而不是常规delete来解除分配内存仍然是未定义的行为。您还没有解决写越界问题,这也是一种未定义的行为;str=strtokstr\t;写入超出已分配内存的范围*str=*str_obj.str;这不是复制字符串的方式,几乎肯定不是OP想要的。删除[]str;当您只分配了一个字符时,将尝试删除字符数组。可能还有更多的东西我只是简单地浏览一下就没有领会。我提到的都不是赋值运算符。@ytlu判断任何代码的正确性,尤其是C/C++代码,因为它在运行时不崩溃是非常愚蠢的。获取免费的静态分析器,如cppcheck或pvs studio,以便在开源内容上使用,并查看它对以下代码的说明:
ytlu@ytlu-PC MINGW32 /d/ytlu/working/cpptest
$ g++ shit.cpp -o a.exe
ytlu@ytlu-PC MINGW32 /d/ytlu/working/cpptest
$ ./a.exe
Please enter clients' id: This is a test.
This is a test.