在C++的这一段中,delete this讨论了构造的使用.列出了4个限制.
限制1到3看起来很合理.但是为什么限制4在那里我"必须不检查它,将它与另一个指针进行比较,将它与NULL进行比较,打印它,投射它,用它做任何事情"?
我的意思this是又一个指针.为什么我不能把reinterpret_cast它int或者叫它printf()输出它的值?
这个问题不受任何特定编译器警告的约束,以下只是一个例子.
目前我想要一个检查内部退出条件的循环:
while( true ) {
doSomething();
if( condition() ) {
break;
}
doSomethingElse();
}
Run Code Online (Sandbox Code Playgroud)
我不能在Visual C++中编写它 - 它会发出C4127 conditional expression is constant警告.编译器会在我脸上挥动它,虽然很明显它while(true)不能被意外地写出来.
假设我想要编译而没有警告的代码.我的服务有各种解决方法.
解决方法是使用for(;;)但感觉很愚蠢 - 为什么我想要那个奇怪的东西而不是简洁优雅的惯用语while(true)?解决方法二是在行#pragma warning( suppress)之前使用,while( true )但它添加了一个巨大的横幅,它是while-statement本身的两倍.解决方法三是为整个项目禁用C4127(我已经看到它在一个真实项目中完成)但是所有可能的C4127实例也被禁用.
是否有任何优雅的方法来摆脱毫无意义的警告?
MSDN有关于[ComVisible]属性的这篇文章.我不太清楚当一个人设置时会发生什么[ComVisible(true)].
MSDN说
该默认值为true,这表明托管类型是COM可见.不需要此属性来使公共托管程序集和类型可见 ; 它们在默认情况下对COM可见.只有公共类型才能显示.
所以他们说公共类型默认是COM可见的.但他们也说只有通过设置才能看到公共类型[ComVisible(true)].它没有意义:如果默认情况下公共类型是可见的,那么设置如何[ComVisible(true)]使公共类型可见?如果它们已经可见,它们将如何变得更加醒目?
也许我的理解不正确.如果有人能对上述陈述有所了解,我将不胜感激.
我想实现一个函数跟踪器,它将跟踪一个函数执行的时间.我有以下课程: -
class FuncTracer
{
public:
FuncTracer(LPCTSTR strFuncName_in)
{
m_strFuncName[0] = _T('\0');
if( strFuncName_in ||
_T('\0') != strFuncName_in[0])
{
_tcscpy(m_strFuncName,strFuncName_in);
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Entering Func:- <%s>"),m_strFuncName);
LOG(strLog)
m_dwEnterTime = GetTickCount();
}
}
~FuncTracer()
{
TCHAR strLog[MAX_PATH];
_stprintf(strLog,_T("Leaving Func:- <%s>, Time inside the func <%d> ms"),m_strFuncName, GetTickCount()-m_dwEnterTime);
LOG(strLog)
}
private:
TCHAR m_strFuncName[MAX_PATH];
DWORD m_dwEnterTime;
};
void TestClass::TestFunction()
{
// I want to avoid writing the function name maually..
// Is there any macro (__LINE__)or some other way to
// get the function …Run Code Online (Sandbox Code Playgroud) 首先,根据C++标准,使用delete分配的任何内容new[]都是未定义的行为.
在Visual C++ 7中,这种配对可能导致两种后果之一.
如果类型new []'ed有简单的构造函数和析构函数VC++只是使用new而不是new[]和使用delete该块工作正常 - new只调用"分配内存",delete只调用"空闲内存".
如果new []'ed类型有一个非平凡的构造函数或析构函数,则无法完成上述技巧 - VC++ 7必须调用恰当数量的析构函数.因此它预先在数组中size_t存储元素的数量.现在,地址返回的地址new[]到第一个元素,而不是块的开头.因此,如果delete使用它只调用第一个元素的析构函数和调用"空闲内存",其地址不同于"分配内存"返回的地址,这导致HeapFree()内部的一些错误指示我怀疑是指堆腐败.
然而,每个人都可以阅读使用deleteafter new[]导致内存泄漏的错误陈述.我怀疑任何大小的堆损坏都比仅为第一个元素调用析构函数并且可能没有调用的析构函数没有释放堆分配的子对象这一事实重要得多.
如何使用delete之后new[]可能只会导致某些C++实现中的内存泄漏?
有一段时间我发现Tortose SVN changelog中的提交中列出了一个文件,"action"列中显示了"替换".
那是什么意思?这与"修改"有什么不同?
在阅读Bruce Eckel关于命名空间的"Thinking in C++"时,我遇到了以下声明:
但是,您几乎从未在头文件中看到using指令(至少不在范围之外).原因是using指令消除了对该特定命名空间的保护,并且效果持续到当前编译单元结束.如果在头文件中放置using指令(在作用域之外),则意味着在包含此头文件的任何文件中都会发生"名称空间保护"丢失,这通常意味着其他头文件.
您是否愿意用一些简单的例子来帮助我理解上述陈述?
我正在调试一个相当奇怪的堆栈溢出,据说是在堆栈上分配太大的变量引起的,我想澄清以下内容.
假设我有以下功能:
void function()
{
char buffer[1 * 1024];
if( condition ) {
char buffer[1 * 1024];
doSomething( buffer, sizeof( buffer ) );
} else {
char buffer[512 * 1024];
doSomething( buffer, sizeof( buffer ) );
}
}
Run Code Online (Sandbox Code Playgroud)
我理解,它依赖于编译器,也取决于优化器决定什么,但为这些局部变量分配内存的典型策略是什么?
输入功能后是否会立即分配最坏情况(1 + 512千字节)或首先分配1千字节,然后根据条件另外分配1或512千字节?
c++ stack-overflow memory-management local-variables visual-c++
有一段时间,需要在C++中使用无操作语句.例如,当实现assert()在非调试配置中禁用时(也请参阅此问题):
#ifdef _DEBUG
#define assert(x) if( !x ) { \
ThrowExcepion(__FILE__, __LINE__);\
} else {\
//noop here \
}
#else
#define assert(x) //noop here
#endif
Run Code Online (Sandbox Code Playgroud)
到目前为止,我的印象是正确的方法是(void)0;用于无操作:
(void)0;
Run Code Online (Sandbox Code Playgroud)
但是我怀疑它可能会在某些编译器上触发警告 - 类似于C4555: expression has no effect; expected expression with side-effectVisual C++警告,这种情况不是针对这种特殊情况发出的,而是在没有强制转换时发出的void.
它普遍便携吗?有没有更好的办法?
我有一个.NET类库,它有一个带静态方法的类.我希望我的代码在一个单独的进程中运行该静态方法 - 就像我在一个单独的进程中在一个单独的线程中运行它一样.
我知道我可以创建一个单独的控制台应用程序项目从内部调用静态方法,Main()但这对我的部署方案不方便 - 我宁愿不携带额外的.exe文件.我知道我可以使用Powershell来调用它,但这意味着依赖于Powershell,我宁愿避免使用它.
有没有办法在仅使用.NET的单独进程中运行代码?也许我可以在运行时为这个单独的进程创建可执行文件?
c++ ×7
c# ×2
.net ×1
com ×1
comvisible ×1
macros ×1
namespaces ×1
no-op ×1
profiling ×1
svn ×1
tortoisesvn ×1
visual-c++ ×1