我如何在客观C++中管理记忆
How could I manage memory in objective C++
我不熟悉客观的c++,这是我的问题:假设我有一个类
class MyTestClass
{
public:
int memLength_;
char *mem;
MyTestClass(int memLength)
{
memLength_ = memLength;
mem = new char[memLength_];
}
~MyTestClass()
{
delete []mem;
}
}
现在我想做的是使用 Objective C++ 创建一个MyTestClass
对象,我所做的如下:
@interface ObjectRetriever : NSObject
+ (MyTestClass)ObtainMyTestClass; // Function 1
+ (MyTestClass*)ObtainMyNextTestClass; //Function 2
@end
+(MyTestClass)ObtainMyTestClass
{
int memLen = 100;
MyTestClass myClass(memLen)
return myClass;
}
+ (MyTestClass*)ObtainMyNextTestClass
{
MyTestClass *myClassPtr;
myClassPtr = new MyTestClass(memLen)
return myClassPtr;
}
因此,当我使用 ObjectRetriever
创建MyTestClass
对象时,我将以这种方式执行此操作
MyTestClass testClassObject1 = [ObjectRetriever ObtainMyTestClass];
MyTestClass *testClassObjectPtr2 = [ObjectRetriever ObtainMyNextTestClass];
我的问题如下:
-
ObtainMyTestClass
和ObtainMyNextTestClass
,哪一个更好? - 如果我以这种方式实现和使用类,我会有内存泄漏的危险吗?
谢谢。
首先,对您的特定问题的简短回答
如果我以这种方式实现和使用类,我会有内存泄漏的危险吗?
是的。如果将来不删除 int 数组,它将丢失。此外,在第二个(指针)实现中,您可能会额外丢失 MyTestClass 实例。
AcquiretainMyTestClass 和 AcquiretainMyNextTestClass,哪个更好?
获取MyTestClass,因为丢失MyTestClass实例没有危险。
现在是长部分。主要问题是我不清楚你真正想要什么。问题标题表明您希望干净地管理(即保留/释放)数据。但是,在描述中,您声明数据由类的用户手动管理,并且您希望以这种方式进行管理。然后,在您的代码示例中,您尝试混合执行两者(数组更新由 ObjectRetriever 自动完成,数组删除由用户决定)。所以,这是我的建议:
a) 如果你想让内存管理由用户决定,你不需要 Objective-C Wrapper 类。当你使用Objective-C++时,你可以使用与C++完全相同的MyTestClass,就像在第二个代码块中一样。
b) 如果你想要安全的内存管理,并且你不能或不想改变 MyTestClass,我建议将 int 数组的创建和删除包装在 ObjC 对象的 init 和 dealloc 中。这应该适用于或不带 ARC。
@interface TestClassWrapper :NSObject{
int* array;
}
-(MyTestClass) getTestClass;
@end
@implementation TestClassWrapper
-(id)init{
if(![super init])return nil;
array=new int[100];
return self;
}
-(void)dealloc{
delete[] array;
[super dealloc];
}
-(MyTestClass)getTestClass{
return MyTestClass(100,array);
}
}
@end
c) 如果你想要安全的内存管理,并且你可以并且想要更改 MyTestClass,我建议重写 MyTestClass 作为不需要外部内存管理。
- 当vector是tje全局变量时,c++中vector的内存管理
- 松弛原子与无同步情况下的记忆连贯性
- 如何维护资源管理器项目视图中当前可见的项目列表
- 如何在GTK程序运行时禁用屏幕保护程序/电源管理/屏幕消隐
- 资源管理设计模式
- 使用"Task"函数指针队列定义作业管理器
- 递归函数有效,但无法记忆
- 实现动态插件管理器
- Alt+Enter 在 Win32 应用中,管理大小调整和分辨率
- libcurl 和 DNS ttl 中的内部连接管理
- 如何将记忆应用于此递归函数?
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 在C++管理一家中国.txt
- 共享记忆:让我们谈谈它的特殊性
- 编译器资源管理器和 GCC 具有不同的输出
- 我们可以通过 IPC 传递具有动态管理成员的类对象吗?
- 使用 Git 处理 C++ Visual Studio 2019 解决方案的外部依赖项源代码管理的最佳方法是什么?
- Q没有管理权限的 exe 无法启动维护工具
- 为什么nlohmann不释放记忆
- 我如何在客观C++中管理记忆