【问题标题】:C++: instantiatiate array of objects that contain pointer to char arrayC ++:实例化包含指向char数组的指针的对象数组
【发布时间】:2013-01-22 03:39:39
【问题描述】:
class A
{
    char *name;
public:
    A();
    A(char*);
    ~A();
};

A::A()
{

}
A::A(char* s)
{
    int k=strlen(s);
    name=new char[k+1];
    strcpy_s(name,k+1,s);
}
A::~A()
{
    if(name!=NULL)
        delete[] name;
}

int _tmain(int argc, _TCHAR* argv[])
{
    A *v=new A[20];
    delete[] v;
    system("pause");
    return 0;
}

我在运行时收到以下错误:test212.exe 中 0x5B987508 (msvcr110d.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0xCDCDCDC1。 这显然是一个内存问题,但是你能告诉我在这个代码示例中发生了什么吗?

【问题讨论】:

  • 如果您正在编写 C++,请不要编写 C。在 C 和 char * 或 C++ 和 vector<string> 之间进行选择。
  • 你在哪里将 name 初始化为 null?;)
  • make name = nullptr 在“默认”构造函数中。
  • 在默认构造函数中将name初始化为NULL
  • 这是毫无意义的代码。只需在你的类定义中说std::string name;,然后把动态内存管理留给那些比你有更多时间花在这上面的人。你还有更重要的事情要做。

标签: c++ char heap-memory


【解决方案1】:

new A[20] 调用默认构造函数,而你没有在默认构造函数中初始化name。您不能假设它将为您设置为NULL。在没有初始化的情况下,delete[] name 具有未定义的行为。

【讨论】:

    【解决方案2】:

    A *v=new A[20]; 通过默认构造函数A::A() 构造新的A 对象。您的自定义构造函数 A::A(char* s) 永远不会被调用,因此,name 永远不会分配任何内存。当调用析构函数时,您正在尝试delete[] 不存在的内存。这会导致您看到的异常。

    【讨论】:

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