首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我为一个配对对象分配了内存,但未能将该对象放在那里

我为一个配对对象分配了内存,但未能将该对象放在那里
EN

Stack Overflow用户
提问于 2013-04-16 01:42:25
回答 2查看 337关注 0票数 0

我希望有一个动态的指针数组,指向指向配对元素的指针;

代码语言:javascript
复制
int m_size = 0;
Pair** ar = new Pair*[++m_size];
*ar[0] = Pair(key, data);

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

它发生在MyString的重载操作符中(这里标记了异常抛出的时间):

代码语言:javascript
复制
MyString & MyString::operator = (const MyString & refMyString){
HERE: this->m_pStr = refMyString.m_pStr;
    return *this;
}

我的类(为了我们的目的,稍微简化了一点):

代码语言:javascript
复制
class Pair{
    MyString m_key;
    Data* m_data;
}


class MyString
{
    char* m_pStr;
}

下面是我在调试器中得到的结果:

http://sdrv.ms/ZwkZ9P

http://sdrv.ms/17eoGp6

据我所知,当我配对** ar = new Pair*++m_size时,创建了一个指向Pair实例空间的新指针。但它只是内存中的空间。当我试图操作它的时候,我失败了。

怎么做对我来说是个谜。你能帮我一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-16 01:46:28

您分配了一个Pair*数组,但是:

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

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

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

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

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

或者更好的是,使用标准容器(向量、列表、双端队列,...)而不是C数组,它要么包含普通对象,要么包含智能指针(unique_ptr或shared_ptr),这样您就不必自己管理内存。

票数 0
EN

Stack Overflow用户

发布于 2013-04-16 01:48:38

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

代码语言:javascript
复制
// 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];
}

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

代码语言:javascript
复制
// later
for(int x = 0; x < 10; ++x)
   delete [] p[x];

delete [] p;

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

代码语言:javascript
复制
std::vector<std::vector<int>> p;

p.resize(10);

for(int x = 0; x < 10; ++x)
{
   p[x].resize(3);
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16021444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档