无法将多个Cstring添加到Cstrings数组中

时间:2015-11-24 21:33:08

标签: c++ dynamic-arrays

我有这个函数用于将事件(每个事件都是cstring)添加到事件数组中:

bool vendor::addEvent(const char * event)
{
    if (eventsSize == EVENTS_CAP - 1)
        return false;
    eventsSize++; //keep track of the size of the array
    this->events = new char*[EVENTS_CAP]; //outer array
    this->events[eventsSize-1] = new char[strlen(event) + 1]; //cstring array
    strcpy(this->events[eventsSize-1], event);
    return true;
}

EVENTS_CAP等于20并且是我的供应商类的一部分,以及eventsSize和事件(您将在下面的图像中看到)。传递一个事件后,此功能正常工作:enter image description here

但传入另一个事件会导致数组不可读:enter image description here

你知道造成这种情况的原因是什么吗?

2 个答案:

答案 0 :(得分:3)

每次调用events函数时,您都会重新分配addEvent()数组(并泄漏旧数组)。

因为你增加eventsSize,你每次都写入下一个数组成员,并且之前的数组成员未被初始化(这解释了为什么在第二次传递时数组看起来像垃圾一样)。

您可能只需要进行以下更改:

if (!this->events) this->events = new char*[EVENTS_CAP]; //outer array

答案 1 :(得分:1)

我没有代表评论或我愿意。

那就是说,如果我们确切地知道你所定义的“事件”是什么会有所帮助。根据我们所做的信息,我想象一下

this->events = new char*[EVENTS_CAP]; //outer array
this->events[eventsSize-1] = new char[strlen(event) + 1]; //cstring array

第一行是内存泄漏。您正在重新定义事件每次指向的位置。

在第二行if(eventsSize - 1)> EVENTS_CAP你要破坏一些东西。

由于这是标记C ++,我建议使用std :: vector和std :: string,只需要一个std :: vector。