Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
程序在删除[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 - Fatal编程技术网

程序在删除[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.