最近我们找到了一个"好方法",通过使用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关键字怎么样?
我需要将字符串格式化为双尾终止字符串才能使用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) 我偷看了我的祖先的代码,发现在以下情况下泄漏:
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线程后工作线程是否会退出会导致此问题?
任何人都可以通过帮我解释一下来振作起来吗?我迷路了....
静态检查工具显示违反以下代码:
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'类
描述:避免强制转换继承层次结构.此规则检测从基类指针到子类指针的强制类型转换.
好处:允许强制转换继承层次结构会导致维护问题,而从基类进行向下转换始终是非法的.
参考文献:
- Scott Meyers,"有效的C++:50种改进程序和设计的具体方法",第二版,Addison-Wesley,(C)2005 Pearson Education,Inc.,章节:"继承和面向对象设计",第39项
- 联合攻击手,空中车辆,C++编码标准第4.23章类型转换,AV规则178
你认为不从基类指针转换为子类指针是一个好习惯吗?为什么以及何时应遵循此规则?
当我以非常简单的方式编写以下行时,我发现了一个奇怪的输出:
码:
printf("LOL??!\n");
printf("LOL!!?\n");
Run Code Online (Sandbox Code Playgroud)
输出:

即使代码是在MBCS和UNICODE下编译的,也会发生这种情况.
输出因"?"的顺序而异.和"!"......
任何的想法?
有一个现有的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) 当我通过同事写的代码时,在某个地方,他们使用:
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)
事实上,这两种情况都在执行所需的操作,它只是一种使代码看起来更复杂的方法吗?
您对上述两个问题的建议是什么?什么时候适合使用它们?为什么?
我不确定从下面的代码中获取此类错误(堆损坏)的根本原因是什么.当我单步执行程序时,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) 我想在我的代码中使用批处理命令将文件复制到目标.
szCommand.Format(_T("copy \"%s\" \"%s\""), szOrg, szTargetFile);
_wsystem(szCommand);
Run Code Online (Sandbox Code Playgroud)
但是,每次调用_wsystem时,都会提示一个控制台窗口,这非常不愉快.
有没有办法调用_wsystem而不显示控制台窗口?还是其他任何选择?
我正在使用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++ ×9
c ×3
mfc ×3
api ×1
batch-file ×1
casting ×1
clipboard ×1
corruption ×1
dereference ×1
heap ×1
memory-leaks ×1
string ×1
trigraphs ×1
visual-c++ ×1
windows ×1