小编wen*_*eng的帖子

在C++中使用continue关键字的另一种方法

最近我们找到了一个"好方法",通过使用continue来注释掉代码行:

for(int i=0; i<MAX_NUM; i++){
  ....
  .... //--> about 30 lines of code
  continue;
  ....//--> there is about 30 lines of code after continue
  ....
}
Run Code Online (Sandbox Code Playgroud)

我问问为什么前面的开发人员将continue关键字放在密集循环中.最有可能的是他/她认为放置"继续"关键字而不是删除所有不需要的代码更容易......

通过查看以下场景,它引发了另一个问题:

情景A:

for(int i=0; i<MAX_NUM; i++){
  ....
  if(bFlag)
    continue;
  ....//--> there is about 100 lines of code after continue
  ....
}
Run Code Online (Sandbox Code Playgroud)

情景B:

for(int i=0; i<MAX_NUM; i++){
  ....
  if(!bFlag){
  ....//--> there is about 100 lines of code after continue
  ....
  }
}
Run Code Online (Sandbox Code Playgroud)

你觉得哪个最好?为什么?break关键字怎么样?

c++ visual-c++

13
推荐指数
2
解决办法
2187
查看次数

双以null结尾的字符串

我需要将字符串格式化为双尾终止字符串才能使用SHFileOperation.

有趣的部分是我发现以下工作之一,但不是两个:

  // Example 1
  CString szDir(_T("D:\\Test"));
  szDir = szDir + _T('\0') + _T('\0');

  // Example 2  
  CString szDir(_T("D:\\Test"));
  szDir = szDir + _T("\0\0");

  //Delete folder
  SHFILEOPSTRUCT fileop;
  fileop.hwnd   = NULL;    // no status display
  fileop.wFunc  = FO_DELETE;  // delete operation
  fileop.pFrom  = szDir;  // source file name as double null terminated string
  fileop.pTo    = NULL;    // no destination needed
  fileop.fFlags = FOF_NOCONFIRMATION|FOF_SILENT;  // do not prompt the user
  fileop.fAnyOperationsAborted = FALSE;
  fileop.lpszProgressTitle     = NULL;
  fileop.hNameMappings         = NULL;
  int ret …
Run Code Online (Sandbox Code Playgroud)

c++ string mfc shfileoperation

6
推荐指数
2
解决办法
4270
查看次数

线程中的睡眠会导致内存泄漏

我偷看了我的祖先的代码,发现在以下情况下泄漏:

1)启动应用程序
b )启动应用程序后,在4秒内关闭应用程序

泄漏消息:

f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\thrdcore.cpp(306) : {58509} client block at 0x016DFA30, subtype c0, 68 bytes long.
Run Code Online (Sandbox Code Playgroud)

随后,我通过代码,在控制工作线程功能的4个睡眠中发现了可疑的原因.

测试程序:

UINT InitThread(LPVOID pParam)
{
      Sleep(4000);  //4000 is the default value, it reads from a registry key.
      CMyMFCTestProjectDlg* pTest = (CMyMFCTestProjectDlg*)pParam;
      pTest->DoSomething();  
      return 0;  //--> Exit thread
}

BOOL CMyMFCTestProjectDlg::OnInitDialog() {
...
AfxBeginThread(InitThread, this);
...
}
Run Code Online (Sandbox Code Playgroud)

如果我减少/移除睡眠定时器,泄漏将被解决.
但是,我想知道它是如何发生的.是由于工作线程还是GUI线程终止?GUI线程后工作线程是否会退出会导致此问题?

任何人都可以通过帮我解释一下来振作起来吗?我迷路了....

c++ mfc multithreading memory-leaks

6
推荐指数
1
解决办法
2951
查看次数

关于从基类到子类指针的向下转换

静态检查工具显示违反以下代码:

class CSplitFrame : public CFrameWnd  
...
class CVsApp : public CWinApp
CWnd* CVsApp::GetSheetView(LPCSTR WindowText)
{
 CWnd* pWnd = reinterpret_cast<CSplitFrame*>(m_pMainWnd)->m_OutputBar.GetChildWnd(WindowText);
 return pWnd;
}
Run Code Online (Sandbox Code Playgroud)

错误消息:类'CSplitFrame'继承自'CWnd'类

描述:避免强制转换继承层次结构.此规则检测从基类指针到子类指针的强制类型转换.

好处:允许强制转换继承层次结构会导致维护问题,而从基类进行向下转换始终是非法的.

参考文献:

  1. Scott Meyers,"有效的C++:50种改进程序和设计的具体方法",第二版,Addison-Wesley,(C)2005 Pearson Education,Inc.,章节:"继承和面向对象设计",第39项
  2. 联合攻击手,空中车辆,C++编码标准第4.23章类型转换,AV规则178

你认为不从基类指针转换为子类指针是一个好习惯吗?为什么以及何时应遵循此规则?

c++ mfc static-analysis casting effective-c++

5
推荐指数
2
解决办法
9392
查看次数

打印?和!! 以不同的顺序将显示不同的输出

当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:

码:

 printf("LOL??!\n");
 printf("LOL!!?\n");
Run Code Online (Sandbox Code Playgroud)

输出: 替代文字

即使代码是在MBCS和UNICODE下编译的,也会发生这种情况.

输出因"?"的顺序而异.和"!"......

任何的想法?

c trigraphs

5
推荐指数
3
解决办法
392
查看次数

如何修改通过值传递的原始变量的内容?

有一个现有的API函数,它只允许插件(DLL)接收三个参数并执行一些操作:

int ProcessMe(int nCommand, unsigned int wParam, long lParam);
Run Code Online (Sandbox Code Playgroud)

现在,从主程序(exe),想将两个变量传递给插件,并要求插件修改其内容,主程序将再次读取它们,以执行某些任务.

我的问题是,从上面的函数,我可以执行此操作,而无需更改函数参数吗?

例:

int ProcessMe(int nCommand, unsigned int wParam, long lParam)
{
  // modify the parameters//
  return 0;
}

int main()
{
  BOOL bSave = TRUE;
  int nOption = 0;
  ProcessMe(0, (unsigned int)(&bSave), (long)(&nOption));
  if(FALSE==bSave)
    printf("bSave is modified!");
  return 1;
}
Run Code Online (Sandbox Code Playgroud)

c c++ api parameter-passing

5
推荐指数
1
解决办法
299
查看次数

如何以及何时正确使用*这个指针和参数匹配?

当我通过同事写的代码时,在某个地方,他们使用:

this->doSomething(); //-->case A
doSomething(); //-->case B
Run Code Online (Sandbox Code Playgroud)

事实上,我不确定*这个指针的很好用法...... :(

参数匹配的另一个问题:

obj.doOperation();  //-->case C
(&obj)->doOperation(); //-->case D
Run Code Online (Sandbox Code Playgroud)

事实上,这两种情况都在执行所需的操作,它只是一种使代码看起来更复杂的方法吗?

您对上述两个问题的建议是什么?什么时候适合使用它们?为什么?

c++ dereference

4
推荐指数
1
解决办法
194
查看次数

SetClipboardData()期间堆损坏

我不确定从下面的代码中获取此类错误(堆损坏)的根本原因是什么.当我单步执行程序时,TCHAR值被正确分配并复制到剪贴板数据.但是,当它继续进行SetClipboardData(...)时会崩溃.

任何大师都可以帮助发现错误吗?

提前致谢.

错误对话框:

堆积在04A781C0修改为04A78282过去请求的大小为Windows Windows已触发V4.exe中的断点.

这可能是由于堆的损坏,这表明V4.exe或其加载的任何DLL中存在错误.

这也可能是由于用户在V4.exe具有焦点时按下F12.

输出窗口可能包含更多诊断信息.程序'[10840] V4.exe:Native'已退出,代码为0(0x0).

码:

    int nCount = m_ListBox.GetCount();
    CString szTemp, szText;
    for(int i=0; i<nCount; i++)
    {
        m_ListBox.GetText(i, szTemp);
        szText = szText + _T("\n") + szTemp;
    }
    if(OpenClipboard())
    {
        EmptyClipboard();
        HGLOBAL hClipboardData;
        size_t size = (szText.GetLength()+1) * sizeof(TCHAR);
        hClipboardData = GlobalAlloc(NULL, size);
        TCHAR* pchData = (TCHAR*)GlobalLock(hClipboardData);
        _tcscpy_s(pchData, size, LPCTSTR(szText));
#ifdef _UNICODE
        SetClipboardData(CF_UNICODETEXT, hClipboardData);  //--> crash here
#else
        SetClipboardData(CF_TEXT, hClipboardData);
#endif
        GlobalUnlock(hClipboardData);
        CloseClipboard();
    }
Run Code Online (Sandbox Code Playgroud)

列表框数据:

John Smith  1978  
Angelina    1975  
Brad Pitt   1950  
Run Code Online (Sandbox Code Playgroud)

c++ heap clipboard corruption

3
推荐指数
1
解决办法
2352
查看次数

如何在不显示控制台的情况下调用_wsystem?

我想在我的代码中使用批处理命令将文件复制到目标.

    szCommand.Format(_T("copy \"%s\" \"%s\""), szOrg, szTargetFile);
    _wsystem(szCommand);
Run Code Online (Sandbox Code Playgroud)

但是,每次调用_wsystem时,都会提示一个控制台窗口,这非常不愉快.

有没有办法调用_wsystem而不显示控制台窗口?还是其他任何选择?

c++ windows batch-file

2
推荐指数
1
解决办法
919
查看次数

如何转换main()函数的返回值?

我正在使用Visual Studio 2008.对于下面的代码

double main()
{
}
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误C3874:'main'的返回类型应为'int'而不是'double'

但如果我使用下面的代码

char main()
{
}
Run Code Online (Sandbox Code Playgroud)

没有错误.运行并退出输出窗口后显示

程序'[5856] test2.exe:Native'已退出,代码为-858993664(0xcccccc00).

问题:编译器是否从默认返回值零(整数)到char进行隐式转换?

如何生成代码0xcccccc00?

看起来该代码中的最后一个字节似乎是实际的返回值.为什么0xcccccc即将到来?

c c++

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