作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
希望我的问题不是多余的。我发现一些帖子与我的问题很接近,但并不完全相同。
我有一段代码是这样的:
class myClass
{
public:
myClass(){
for(int i=0;i<1000;i++){
myArray[i]=i;
}
};
~myClass(){};
int getValue(int index){return myArray[index];}
private:
int myArray[1000];
} ;
int myFunction(myClass* myObject)
{
int res=0;
for(int i=0;i<1000;i++){
res=res+myObject->getValue(i);
}
delete myObject;
myObject = new myClass();
return res;
}
int main()
{
myClass *myObject = new myClass();
int res= myFunction(myObject);
delete myObject;
return res;
}
我的代码中是否存在内存泄漏?或者这样可以吗?我不确定应该如何处理数组。
谢谢,朱尔斯
最佳答案
myObject = new myClass();
只修改函数内部的局部指针,而不修改 main
中声明的指针。
这就是为什么在 myFunction
中分配的 myClass
对象被泄露,你最终将 main
中的指针指向的对象双删除到(这是未定义的行为)。
这是因为指针默认是通过拷贝传递的。如果您希望函数修改 main
中的指针,请将引用传递给它:
int myFunction(myClass*& myObject)
^
关于数组,它是一个自动变量。所以它绑定(bind)到当前堆栈框架并因此自动释放,您无需执行任何操作。如果您使用 new[]
手动分配了数组,仅 那么您是否需要明确地delete[]
它。
关于具有预定义大小的 C++ 数组作为成员变量和内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34582877/
我是一名优秀的程序员,十分优秀!