Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 由于new()或malloc导致内存泄漏_C++_Memory Leaks - Fatal编程技术网

C++ 由于new()或malloc导致内存泄漏

C++ 由于new()或malloc导致内存泄漏,c++,memory-leaks,C++,Memory Leaks,我正在尝试实现一种替代常规连续动态数组的方法,在这种方法中,我使用一个指针向量,每个指针都指向一个恒定大小的数组,并将其称为XVector 对于一定数量的输入(比如150个元素),它可以正常工作,但超过这个限制,它就会抛出异常 我尝试使用“newanddelete”而不是“mallocandfree”,它确实增加了限制——比如说1200个元素——但仍然存在同样的问题 < /P> 这是我的主要节目: XVector<int> xv; for(int i=0;i<1210;i+

我正在尝试实现一种替代常规连续动态数组的方法,在这种方法中,我使用一个指针向量,每个指针都指向一个恒定大小的数组,并将其称为XVector

对于一定数量的输入(比如150个元素),它可以正常工作,但超过这个限制,它就会抛出异常

我尝试使用“newanddelete”而不是“mallocandfree”,它确实增加了限制——比如说1200个元素——但仍然存在同样的问题

<我使用C++ > < /P> 这是我的主要节目:

XVector<int> xv;

for(int i=0;i<1210;i++){
    int temp = rand()%100;
    xv.pushBack(temp);
}


for(int i=0;i<xv.size();i++){
    cout<<xv.getValue(i)<<" ";
}

cout<<"\n\n"<<xv.capacity();
return 0;
XVector xv;

对于(int i=0;i您的程序会泄漏内存,因为您从未释放析构函数中的指针。您必须实现析构函数来解决内存泄漏问题(除了移动构造函数、复制构造函数、赋值复制和赋值移动)


除了valgrind,您还可以使用输出更好、运行更快的。导致代码崩溃的代码主要问题不是内存泄漏。完全内存泄漏不会在短期内导致崩溃。在内存泄漏的情况下,您的应用程序会一直工作,直到RAM上有足够的空间,然后如果RAM已满,则cr灰烬发生。您在查找第二维度索引时在position()方法中出错

例如,当您调用position(索引:29)时,因为执行了浮点运算,所以(result-pos.first)*b的浮点精度结果是9.00000095。这意味着它的结果与实际结果(9)略有差异。然后您调用ceil(9.00000095)它返回10作为结果。这意味着您可以访问第二维度的索引10,而您可以使用从0到9的索引,并且您的索引访问超出范围,这会导致您在一段时间后崩溃,并且您的程序可能有未定义的行为

位置法的正确示例为:

pair<int, int> position(int index){
    pair<int, int> pos;
    float result = ((float)index / b);
    pos.first = result; //Row #
    pos.second = index%b; // changed line
    return pos;
}
对位置(int索引){
配对位置;
浮动结果=((浮动)指数/b);
pos.first=result;//行#
pos.second=索引%b;//行已更改
返回pos;
}

最后,您应该定义析构函数并删除新操作符分配的所有内存。所有向量元素(数组)需要删除。

看起来你在构建一个我看不到你实现了析构函数、复制构造函数或复制赋值运算符。这绝对是我的意思。方便阅读:顺便说一句,这与你的问题无关,但它让我发疯:
return currentIndex==0?true:false;
。只是
return currentIndex==0;
非常充分,可读性也更高。此程序存在索引超出范围异常。主要问题不是内存泄漏。内存泄漏不会在短期内导致应用程序崩溃。@hamed:这完全取决于您泄漏的数量以及泄漏的方式often@user1413793,此应用程序存在另一个问题,导致应用程序在内存之前崩溃y泄漏,但您没有提到主要问题。此应用程序存在访问冲突。如果您解决了内存泄漏,则会出现异常。@hamed可能是这样,但问题是关于内存泄漏的。最好一次解决一个问题,否则问题会蔓延开来,不太适用于具有类似问题的未来程序员。您的想法是正确的w当大问题没有出现在问题中时。但是大访问冲突是显而易见的,你不会谈论它。“完全的内存泄漏不会导致短期内崩溃”这完全取决于你泄漏了多少,以及泄漏的频率。完全忽略提出的问题。有用的信息,但在问题的上下文中是无用的。“在内存泄漏的情况下,你的应用程序会一直工作,直到ram上有足够的空间”你省略了几个抽象层。这太棒了!这个小技巧神奇地工作了!非常感谢你,老兄。
pair<int, int> position(int index){
    pair<int, int> pos;
    float result = ((float)index / b);
    pos.first = result; //Row #
    pos.second = index%b; // changed line
    return pos;
}