小编Rob*_*Rob的帖子

_MERGE_PROXYSTUB有什么意义?

我使用VS2008生成了一个ATL COM对象,代码包含对所调用定义的引用_MERGE_PROXYSTUB(因为我在最初运行向导时选择了'Merge proxy/stub'选项.)

代理/存根有什么意义?如果我没有选择合并选项,那么我会得到一个单独的MyControlPS.DLL- 什么时候会被使用?

如果我删除了_MERGE_PROXYSTUB定义包围的所有代码,那么控件似乎注册并正常工作.调试版本甚至没有定义_MERGE_PROXYSTUB,它仍然可以正常工作.

那么,我可以不使用代理/存根吗?

c++ com atl

11
推荐指数
2
解决办法
4378
查看次数

这个C++代码是否会导致内存泄漏(将数组转换为新的)

我一直在研究一些使用可变长度结构(TAPI)的遗留C++代码,其中结构大小将取决于可变长度字符串.结构由铸造数组分配,new因此:

STRUCT* pStruct = (STRUCT*)new BYTE [sizeof(STRUCT) + nPaddingSize];

然后,稍后使用delete调用释放内存:

delete pStruct;
Run Code Online (Sandbox Code Playgroud)

这种数组new []和非数组的混合delete会导致内存泄漏还是依赖于编译器?我是否会更好地更改此代码以使用mallocfree不是?

c++ memory-leaks memory-management

10
推荐指数
4
解决办法
6505
查看次数

你如何组织STL标题?

我正在开发一个使用STL的大型项目,并对您组织STL的首选方式提出疑问#includes.

  • 您是否更喜欢#include使用它的源文件中的每个标头.例如,如果两个foo.cppbar.cpp要求std::string,然后既会#include <string>.
  • 您是否希望拥有一个包含项目使用的所有STL头的头文件(即将它们添加到MS'stdafx.h'预编译头中).

第一种方法的优点是.cpp文件是一个独立的单元,可以在不同的项目中使用,而不必担心你错过了#include.第二种方法的优点是你可以使用你的编译器预编译头支持加上你可以#includes在STL 中pragmas包含禁用一些警告(例如,一些Boost头在第4级编译时会引起警告).

您更喜欢使用哪种?

c++ stl include

10
推荐指数
1
解决办法
1890
查看次数

C++ 0x静态初始化和线程安全

我知道,从C++ 03标准来看,函数范围静态初始化不保证是线程安全的:

void moo()
{
    static std::string cat("argent");  // not thread safe
    ...
}
Run Code Online (Sandbox Code Playgroud)

最终提供标准线程支持的C++ 0x标准,是否需要线程安全的函数范围静态初始化?

c++ thread-safety static-initializer c++11

10
推荐指数
1
解决办法
1112
查看次数

奇怪的static_cast技巧?

在仔细阅读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正在尝试做什么.

c++ qt

10
推荐指数
2
解决办法
2472
查看次数

Qt中的内存管理

大家好,我对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)

在此示例中,应手动删除项目?

c++ qt nokia qt4

10
推荐指数
1
解决办法
1577
查看次数

内联C++代码

以下代码有什么区别:

class Foo  
{
  inline int SomeFunc() { return 42; }
  int AnotherFunc() { return 42; }
};
Run Code Online (Sandbox Code Playgroud)

两个函数都会被内联吗?内联实际上有什么区别吗?关于何时应该或不应该内联代码,是否有任何规则?我经常使用AnotherFunc语法(例如访问器),但我很少inline直接指定.

c++ inline-functions

9
推荐指数
3
解决办法
2920
查看次数

C++ const问题

如果我这样做:

// 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.

c++ gcc const

8
推荐指数
3
解决办法
1945
查看次数

SFTP C++库?

任何人都可以推荐一个体面的SFTP库用于Windows C++应用程序?如果一个跨平台的可用,那就更好了,但这不是必需的.它适用于商业应用程序,因此付费不是问题.

我使用的是极好的Ultimate TCP/IP库,它支持FTP-S但不支持SFTP(是的,我知道,令人困惑的不是它!).

我遇到了Chilkat图书馆,看起来非常好,但想知道是否有其他人使用过.

c++ sftp

8
推荐指数
3
解决办法
2万
查看次数

序列化QGraphicsScene内容

我使用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)

c++ qt

8
推荐指数
1
解决办法
2077
查看次数