无法弄清楚如何准确地表达问题,所以这里有一个例子:
给定这个函数原型:
void Foo(myClass* bar);
我想防止这种用法:
Foo(new myClass());
而是需要一个先前创建的对象:
myClass* bar = NULL;
bar = new myClass();
Foo(bar);
或者
myClass bar;
Foo(&bar);
谢谢。
编辑
这是一个明确的例子:
void Mouse::SetImage(BITMAP* image, int focusX, int focusY) {
if(_image) {
set_mouse_sprite(NULL);
set_mouse_sprite_focus(0, 0);
show_mouse(NULL);
destroy_bitmap(_image);
_image = NULL;
}
if(image) {
_image = create_bitmap(image->w, image->h);
clear_bitmap(_image);
blit(image, _image, 0, 0, 0, 0, image->w, image->h);
}
if(image == NULL) {
focusX = 0;
focusY = 0;
}
_focusX = focusX;
_focusY = focusY;
_dirtyImage = true;
}
用户传入的任何图像都会被复制到对象的图像中。
如果我在复制后解除分配传入的图像并且图像在程序的其他地方使用,它将导致程序因访问冲突而崩溃。
如果他们在线分配存储而我没有释放它,则会发生内存泄漏。如果他们在运行程序的过程中多次调用 SetImage 方法,则问题会更加复杂。
关于使用替代库或 Allegro 库本身的评论将被忽略,我已经知道这很可怕。我别无选择。