我有这个函数用于将事件(每个事件都是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和事件(您将在下面的图像中看到)。传递一个事件后,此功能正常工作:
你知道造成这种情况的原因是什么吗?
答案 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。