我希望有一个动态的指针数组,指向指向配对元素的指针;
int m_size = 0;
Pair** ar = new Pair*[++m_size];
*ar[0] = Pair(key, data);在这里我得到:未处理的异常在0x013729db在lab3.exe: 0xC0000005:访问冲突写入位置0xcdcdcdcd。
它发生在MyString的重载操作符中(这里标记了异常抛出的时间):
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;
}下面是我在调试器中得到的结果:
据我所知,当我配对** ar = new Pair*++m_size时,创建了一个指向Pair实例空间的新指针。但它只是内存中的空间。当我试图操作它的时候,我失败了。
怎么做对我来说是个谜。你能帮我一下吗?
发布于 2013-04-16 01:46:28
您分配了一个Pair*数组,但是:
1)您永远不会初始化该数组中的指针
2)取消引用那些未初始化的指针(它们指向谁知道在哪里)并覆盖那里的内存。
难怪你会得到一个段错误,因为你是在写未分配的内存。
你(可能是?)想要做的是:
ar[0] = new Pair(...)
或者更好的是,使用标准容器(向量、列表、双端队列,...)而不是C数组,它要么包含普通对象,要么包含智能指针(unique_ptr或shared_ptr),这样您就不必自己管理内存。
发布于 2013-04-16 01:48:38
使用双指针创建二维数组时,需要分配两个维度:
// 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);
}https://stackoverflow.com/questions/16021444
复制相似问题