我使用VS2008生成了一个ATL COM对象,代码包含对所调用定义的引用_MERGE_PROXYSTUB
(因为我在最初运行向导时选择了'Merge proxy/stub'选项.)
代理/存根有什么意义?如果我没有选择合并选项,那么我会得到一个单独的MyControlPS.DLL
- 什么时候会被使用?
如果我删除了_MERGE_PROXYSTUB
定义包围的所有代码,那么控件似乎注册并正常工作.调试版本甚至没有定义_MERGE_PROXYSTUB
,它仍然可以正常工作.
那么,我可以不使用代理/存根吗?
我一直在研究一些使用可变长度结构(TAPI)的遗留C++代码,其中结构大小将取决于可变长度字符串.结构由铸造数组分配,new
因此:
STRUCT* pStruct = (STRUCT*)new BYTE [sizeof(STRUCT) + nPaddingSize];
然后,稍后使用delete
调用释放内存:
delete pStruct;
Run Code Online (Sandbox Code Playgroud)
这种数组new []
和非数组的混合delete
会导致内存泄漏还是依赖于编译器?我是否会更好地更改此代码以使用malloc
而free
不是?
我正在开发一个使用STL的大型项目,并对您组织STL的首选方式提出疑问#includes
.
foo.cpp
和bar.cpp
要求std::string
,然后既会#include <string>
.第一种方法的优点是.cpp文件是一个独立的单元,可以在不同的项目中使用,而不必担心你错过了#include
.第二种方法的优点是你可以使用你的编译器预编译头支持加上你可以#includes
在STL 中pragmas
包含禁用一些警告(例如,一些Boost头在第4级编译时会引起警告).
您更喜欢使用哪种?
我知道,从C++ 03标准来看,函数范围静态初始化不保证是线程安全的:
void moo()
{
static std::string cat("argent"); // not thread safe
...
}
Run Code Online (Sandbox Code Playgroud)
最终提供标准线程支持的C++ 0x标准,是否需要线程安全的函数范围静态初始化?
在仔细阅读Qt源代码时,我遇到了这个gem:
template <class T> inline T qgraphicsitem_cast(const QGraphicsItem *item)
{
return int(static_cast<T>(0)->Type) == int(QGraphicsItem::Type)
|| (item && int(static_cast<T>(0)->Type) == item->type()) ? static_cast<T>(item) : 0;
}
Run Code Online (Sandbox Code Playgroud)
请注意static_cast<T>(0)->Type
?我已经使用C++很多年了,但之前从未见过0在static_cast中使用过.这段代码在做什么,是否安全?
背景:如果你从中派生出来QGraphicsItem
的意思是声明一个名为的唯一枚举值Type
,并实现一个名为return 的虚函数type
,例如:
class Item : public QGraphicsItem
{
public:
enum { Type = MAGIC_NUMBER };
int type() const { return Type; }
...
};
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
QGraphicsItem* item = new Item;
...
Item* derivedItem = qgraphicsitem_cast<Item*>(item);
Run Code Online (Sandbox Code Playgroud)
这可能有助于解释static_cast正在尝试做什么.
大家好,我对Qt内存管理有一点疑问,
让我们以Listview为例,在listview中我们通过动态分配内存来添加每个项目.所以在这种情况下我们需要手动删除所有"新"编辑项目.
例如:
Qlistview *list = new Qlistview;
QStandardItemModel *mModel = new QStandardItemModel();
list ->setModel(mModel);
for(int I =0;i<10;i++)
{
QsandardItem *item = new QsandardItem(“Hi”);
mModel->appendRow(item);
}
Run Code Online (Sandbox Code Playgroud)
在此示例中,应手动删除项目?
以下代码有什么区别:
class Foo
{
inline int SomeFunc() { return 42; }
int AnotherFunc() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)
两个函数都会被内联吗?内联实际上有什么区别吗?关于何时应该或不应该内联代码,是否有任何规则?我经常使用AnotherFunc
语法(例如访问器),但我很少inline
直接指定.
如果我这样做:
// In header
class Foo {
void foo(bar*);
};
// In cpp
void Foo::foo(bar* const pBar) {
//Stuff
}
Run Code Online (Sandbox Code Playgroud)
编译器不会抱怨Foo :: foo的签名不匹配.但是如果我有:
void foo(const bar*); //In header
void Foo::foo(bar*) {} //In cpp
Run Code Online (Sandbox Code Playgroud)
代码将无法编译.
到底是怎么回事?我正在使用gcc 4.1.x.
任何人都可以推荐一个体面的SFTP库用于Windows C++应用程序?如果一个跨平台的可用,那就更好了,但这不是必需的.它适用于商业应用程序,因此付费不是问题.
我使用的是极好的Ultimate TCP/IP库,它支持FTP-S但不支持SFTP(是的,我知道,令人困惑的不是它!).
我遇到了Chilkat图书馆,看起来非常好,但想知道是否有其他人使用过.
我使用Qt QGraphicsScene
类,添加预先定义的项目,如QGraphicsRectItem
,QGraphicsLineItem
等我想现场的内容序列化到磁盘.但是,基QGraphicsItem
类(我使用的其他项派生自)不支持序列化,所以我需要滚动自己的代码.问题是所有对这些对象的访问都是通过基QGraphicsItem
指针进行的,所以我的序列化代码很糟糕:
QGraphicsScene* scene = new QGraphicsScene;
scene->addRect(QRectF(0, 0, 100, 100));
scene->addLine(QLineF(0, 0, 100, 100));
...
QList<QGraphicsItem*> list = scene->items();
foreach (QGraphicsItem* item, items)
{
if (item->type() == QGraphicsRectItem::Type)
{
QGraphicsRectItem* rect = qgraphicsitem_cast<QGraphicsRectItem*>(item);
// Access QGraphicsRectItem members here
}
else if (item->type() == QGraphicsLineItem::Type)
{
QGraphicsLineItem* line = qgraphicsitem_cast<QGraphicsLineItem*>(item);
// Access QGraphicsLineItem members here
}
...
}
Run Code Online (Sandbox Code Playgroud)
这不是好的代码恕我直言.所以,我可以像这样创建一个ABC类:
class Item
{
public:
virtual void serialize(QDataStream& strm, int version) = 0; …
Run Code Online (Sandbox Code Playgroud)