【问题标题】:C++ error on char pointerchar指针上的C++错误
【发布时间】:2013-04-14 11:32:41
【问题描述】:

我想在一个结构体中初始化一个 char* 字符串。

这是结构:

typedef struct __String  {
    char*    data;        // C-string data, 
    unsigned* copyRef;     // number of copy reference, delete only when the copyRef is 0
    bool     isACopy;     // this boolean is true when *data is a ref to an other MyString

  __String () {
      data = 0;
      isACopy = false;
      copyRef = new unsigned();
      *copyRef = 0;
      return;
 }

    void addCopyRef() {
        *copyRef++;
    }

    void removeCopyRef() {
        *copyRef--;
    }
 } *MyString;

这就是它崩溃的地方..

void Initialize(MyString& string){

    string->data = new char[LENGHT];
    string->data[0] ='\0'; // this generate an error!
    string->addCopyRef();
}

这是主要的:

MyString left_string, right_string, both_string;
Initialize(left_string);
Initialize(right_string);
Initialize(both_string);

第一个进展顺利,第二个不.. 你能帮我理解问题出在哪里吗?谢谢!

【问题讨论】:

  • 名称__String 是为实现保留的,因此您有未定义的行为。 MyString 也是指针类型。你是如何调用函数的?
  • LENGHT 是如何定义的?你的意思是LENGTH
  • MyString 是指针,可能是NULL
  • @Pradheep,这将为一个字符分配内存并将其初始化为len
  • 我不得不指出,将指针类型命名为MyString 是非常非常邪恶的,除非它是一个实际的 C 字符串,即使那样,重命名它仍然会非常糟糕。

标签: c++ char-pointer


【解决方案1】:

您需要在传递对象之前为对象分配内存,如下所示:

MyString left_string = new __String();
Initialize(left_string);

一般建议不要使用这样的 typedef,它们非常令人困惑并且容易出错。如果你决定 typedef 一个指针,至少表明它是类型中的一个指针,即:typedef struct __String* MyStringPtr

【讨论】:

  • 不,它不是 - MyString 是一个指针(!)所以没有构造函数被调用。
  • typdef 简而言之可以读作typedef struct __String* MyString,因此MyString 是一个指向__String 的指针。
  • @TomerArazy,是的,我没有看到类定义后的小星号:/
【解决方案2】:
typedef struct __String  {
  char*    data;        // C-string data,
  unsigned* copyRef;    // number of copy reference,
                        // delete only when the copyRef is 0
  bool     isACopy;     // this boolean is true when *data
                        // is a ref to an other MyString

  __String () {
    data = 0;
    isACopy = false;
    copyRef = new unsigned;
    *copyRef = 0;
    return;
  }

  void addCopyRef() {
    *copyRef++;
  }

  void removeCopyRef() {
    *copyRef--;
  }
} *MyString;


void Initialize(MyString& string){

  string->data = new char[100];
  string->data[0] ='\0'; // this generate an error!
  string->copyRef = new unsigned();
  string->addCopyRef();
}

int main()
{
  MyString mystring = new struct __String;
  Initialize(mystring);
}

我这样测试没有任何错误。在 Linux 上使用 g++。 我觉得你最好

  • 至少在这里提供错误信息
  • 以及您使用的编译器和平台。

我用下面的另一个 main() 再次测试。

int main()
{
  MyString mystring = new struct __String;
  MyString mystring1 = new struct __String;
  MyString mystring2 = new struct __String;
  Initialize(mystring);
  Initialize(mystring1);
  Initialize(mystring2);
}

使用此测试代码,没有错误。 我认为您错过了实例化mystring 指向的对象(在您的代码中,left_stringright_stringboth_string)。 我猜这就是原因。

并且这段代码从构造函数中产生了内存泄漏。在这种代码状态下,不需要构造函数。

【讨论】:

    猜你喜欢
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-26
    • 2021-01-26
    • 1970-01-01
    • 2012-03-19
    • 2021-08-11
    相关资源
    最近更新 更多