2016-08-16 68 views
1

长的故事:安全使用无效*指针对象

目前,我分配了需要被更新到新的相机设备集成了传统的C项目的工作。从设备制造商的API很简单,我需要的是包括自己的头文件和库到类与设备的工作,例如这里是一个代码示例代码段:

MyClass.h

#include <XFactory.h> 
... 
public: 
XFactory::device myDevice; 
XFactory::xSmartPtr myPtr; 

与设备集成:

MyClass.cpp

#include "MyClass.h" 
... 
myDevice.GetInfo(); 
myPtr.GetFrame(); 
..ect. 

但生活总是给你柠檬。每当我#include MyClass.h到主项目。类似这样的编译错误抛出:

... 
/usr/include/c++/4.8/bits/stl_algobase.h:193:5: note: template<class _Tp> const _Tp& std::min(const _Tp&, const _Tp&) 
... 

做了一些研究,我认为#include <XFactory.h>调用一些C++头是与冲突在我的项目的一些类定义的宏(如最小/最大...)。我不能修复这些代码,这不是我的,所以这里是我的丑陋的解决方法我的课:

短篇小说:

MyClass.h

typedef void* DeviceHandle_t; 
typedef void* FrameHandle_t; 

public: 
DeviceHandle_t myDevice; 
FrameHandle_t myPtr; 

MyClass的.cpp

#include <XFactory.h> //to avoid main project include this header 
MyClass::MyClass(){ 
    myDevice = new XFactory::device(); 
    myPtr = new XFactory::xSmartPtr(); 
} 

MyClass::~MyClass(){ 
    if (myDevice != NULL){ 
     delete (XFactory::device*)myDevice; //this will call class's destructor, won't it? 
     myDevice = NULL; 
    } 

    if (myDevice != NULL){ 
     delete (XFactory::xSmartPtr*)myPtr ; //this will call class's destructor, won't it? 
     myPtr = NULL; 
    }  
} 

要与dev冰:

((XFactory::device*)myDevice)->GetInfo(); 
((XFactory::xSmartPtr*)myPtr)->GetFrame(); 

是的,我无法使用智能指针,因为我的项目是C99,和我几乎都在用C/C++指针的工作经验,是我的解决方法安全?是否有任何其他解决方案不使用原始指针?

+0

您的代码似乎是C++,并且不合法C.另外,您的变量定义应该位于.cpp中,而不是头文件中。也不应该myDevice和myPtr是成员变量而不是全局? –

+0

您关心哪些安全特性?通过使用void指针简单地泄漏内存或类型安全的投降?至于是否调用析构函数,你不能自己测试吗? –

+0

也许你正在使用''而忘记定义'NOMINMAX'。总是这样做。 –

回答

0

这确实不安全,也不需要。

正确的解决方案只是向前声明:

MyClass.h

class DeviceHandle; 
class FrameHandle; 

public: 
DeviceHandle* myDevice; 
FrameHandle* myPtr; 

它没有意义的,说你的项目是C99; public:是您在C++上的免费赠品。这意味着你可以使用智能指针,例如boost::shared_ptr。 C++的每个版本都支持它们,但是没有C版本(甚至没有C11)。