【发布时间】:2010-08-15 20:39:21
【问题描述】:
不知道如何准确地表达问题,所以这里有一个例子:
给定这个函数原型:
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 库本身的评论将被忽略,我已经知道这很糟糕。我别无选择。
【问题讨论】:
-
您为什么要这样做?据我所知,没有一般的方法可以知道其中的区别。
-
我不知道你为什么想要这个,但我可以假设你不希望调用者认为你的代码会为他们解除分配。如果你想保证即使他们内联实例化它,析构函数也会被调用,你可以引用一个智能指针类,而不是一个原始指针。
-
那么你需要什么?除了奇迹。宏。很多宏。
-
我没听懂这个问题。有人可以编辑并解释问题吗
标签: c++ pointers parameters function allegro