0

我想要一个指向 Pair 元素指针的动态指针数组;

int m_size = 0;
Pair** ar = new Pair*[++m_size];
*ar[0] = Pair(key, data);

在这里我得到:lab3.exe 中 0x013729db 处的未处理异常:0xC0000005:访问冲突写入位置 0xcdcdcdcd。

它发生在 MyString 的重载运算符中(抛出异常时的 HERE 标记):

MyString & MyString::operator = (const MyString & refMyString){
HERE: this->m_pStr = refMyString.m_pStr;
    return *this;
}

我的课程(为了我们的目的有点简化):

class Pair{
    MyString m_key;
    Data* m_data;
}


class MyString
{
    char* m_pStr;
}

这是我在调试器中得到的:

http://sdrv.ms/ZwkZ9P

http://sdrv.ms/17eoGp6

好吧,据我所知,当我执行 Pair** ar = new Pair*[++m_size] 时,创建了一个指向 Pair 实例空间指针的新指针。但它只是记忆中的空间。当我尝试操作它时,我失败了。

做什么对我来说是个谜。你可以帮帮我吗?

4

2 回答 2

0

您分配了一个数组Pair*but :

1)您永远不会初始化该数组中的指针

2)您取消引用那些未初始化的指针(指向谁知道哪里)并覆盖那里的内存。

难怪你会得到一个段错误,因为你正在写入未分配的内存。

您(可能?)想要做的是:

ar[0] = new Pair(...)

或者更好的是,使用标准容器(vector、list、deque、...)而不是 C 数组,它可以包含普通对象或智能指针(unique_ptr 或 shared_ptr),这样您就不必自己管理内存.

于 2013-04-15T17:46:27.717 回答
0

使用双指针创建二维数组时,需要分配两个维度:

// allocates an array of 10 int* objects
int** p = new int*[10];

for(int x = 0; x < 10; ++x)
{
   // Allocates an array of 3 integers
   p[0] = new int[3];
}

您需要确保删除您正在创建的所有对象:

// later
for(int x = 0; x < 10; ++x)
   delete [] p[x];

delete [] p;

但是,我建议您只使用std::vector这样您就不需要自己管理内存:

std::vector<std::vector<int>> p;

p.resize(10);

for(int x = 0; x < 10; ++x)
{
   p[x].resize(3);
}
于 2013-04-15T17:48:37.877 回答