代码之家  ›  专栏  ›  技术社区  ›  Kasper Holdum

调试断言错误-删除对char指针的调用

  •  1
  • Kasper Holdum  · 技术社区  · 15 年前

    当我在一个指向我创建的简单类的指针上调用delete函数时,一个 Debug Assertion Failure -Expression:_BLOCK_TYPE_IS_VALID(pHead->nBlockUse) . 我假设这是因为我处理字符串操作错误,从而导致内存损坏。

    我创建了一个基本类,[I]animal[/I],它定义了一个可以通过函数设置的字符串。

    // name
    char * ptrName;
    
    animal::animal(char * name)
    {
     this->SetName(name);
    };
    
    animal::~animal()
    {
     delete [] ptrName;
    }
    
    void animal::SetName(char * name)
    {
     ptrName = name;
    };
    

    delete ptrName delete [] ptrName 但无济于事。

    animal * cat = new animal("Optimus Prime");
    delete cat;
    

    我错过了什么?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Community CDub    8 年前

    所以我决定在SITY C++中添加一点。

    然后自己做一个帮助,使用C++ . 那就是使用 std::string :

    // name
    std::string name_;
    
    animal::animal(const std::string& name)
      : name_(name)
    {
    }
    
    //animal::~animal() // not needed any longer
    
    //note: copying also automatically taken care of by std::string
    //animal(const animal&)
    //animal& operator=(const animal&)
    
    void animal::SetName(const std::string& name)
    {
     name_ = name;
    }
    

    The Definitive C++ Book Guide and List . 我建议你 . 它有一个陡峭的学习曲线,但既然你已经知道了一点C++,那是250页,可能会让你走上正确的轨道。

    根据经验: 在类的析构函数中,其唯一目的是管理这一资源 ,您的设计有问题。 就我个人而言,每当我觉得需要编写析构函数、复制构造函数或赋值运算符时,我就会产生怀疑。

        2
  •  2
  •   JaredReisinger    15 年前

    "Optimus Prime" 未动态分配,因此调用 delete 在上面。

        3
  •  2
  •   David    15 年前

    问题来自于删除不属于您的指针。您尚未分配字符串,因此不能将其删除。您正在使用的C字符串是由编译器静态分配的。

        4
  •  2
  •   Gangadhar    15 年前

    问题在于 setName 函数您只是将名称赋给ptrName。在本例中,名称是一个不能删除的const char字符串指针(它没有在堆上分配)。要避免此错误,可以在类中使用std::string,也可以在 animal 类并将指针赋给它。然后,在析构函数中可以删除数组。

        5
  •  1
  •   Jeff Foster    15 年前

    谁拥有你的绳子?

    例如,当你构造你的新动物时,你传递的是一个字符串文本-这不是你要释放的。

    您应该考虑避免char*,而只使用std::string。

    如果必须使用char*,请考虑所有权。例如,一个选项是获取字符串的副本(使用strdup)并拥有它。这样你就不会被这种奇怪的虫子困住了

    char* szFoo = strdup("my string");
    {
      animal a(szFoo);
    }
    // At this point szFoo has been deleted by the destructor of a
    // and bad things will start to happen here.
    printf("The value of my string %s",szFoo);