我想测试当函数的返回值是一个对象时C++的行为.我做了一个小例子来观察分配了多少字节,并确定编译器是否复制了对象(比如当对象作为参数传递时)或者返回某种引用.
但是,我无法运行这个非常简单的程序而且我不知道为什么.错误说:"某些dbgdel.cpp文件中的"调试断言失败!表达式:BLOCK_TYPE_IS_INVALID".Project是一个win32控制台应用程序.但我很确定这段代码有问题.
class Ctest1
{
public:
Ctest1(void);
~Ctest1(void);
char* classSpace;
};
Ctest1::Ctest1(void)
{
classSpace = new char[100];
}
Ctest1::~Ctest1(void)
{
delete [] classSpace;
}
Ctest1 Function(Ctest1* cPtr){
return *cPtr;
}
int _tmain(int argc, _TCHAR* argv[])
{
Ctest1* cPtr;
cPtr=new Ctest1();
for(int i=1;i<10;i++)
*cPtr = Function(cPtr);
delete cPtr;
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我无法理解lambda函数和捕获变量的机制,因此我做了一些测试并得出了非常奇怪的结论.那是:
class ClassA
{
public:
std::function<void()> lambda;
void DoYourStuff()
{
int x;
x = 1;
lambda = [=] () { printf("A %d\n", x);};
lambda();
x = 2;
lambda();
}
};
class ClassB
{
public:
std::function<void()> lambda;
int x;
void DoYourStuff()
{
x = 1;
lambda = [=] () { printf("B %d\n", x);};
lambda();
x = 2;
lambda();
}
};
Run Code Online (Sandbox Code Playgroud)
注意:唯一的区别在于x变量的位置; ClassA和ClassB的功能有不同的输出!
A 1
A 1
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:
谢谢
浮点算术运算是否有可能在不同的CPU上产生不同的结果?CPU是指x86和x64的全部内容.并且通过不同的结果,我的意思是即使只有一个最不重要的位是不同的.我需要知道我是否可以在项目上使用浮点运算,这对于在不同的机器上具有与相同输入相对应的完全相同的结果是至关重要的.
编辑:添加了c ++标签.
还要澄清一下:我需要可重复的结果运行时间.我不希望不同编辑的结果相同.
在具有共同祖先的类上的指针之间进行转换是否合法?编译器是否注意到这种层次结构并确保其安全(调用 1)?或者用户是否必须手动遍历层次结构才能始终安全(调用 2)?
说我们有
class A{};
class B:A{};
class C:A
{
public:
int SomeFunc(){return 3;}
};
int _tmain(int argc, _TCHAR* argv[])
{
B* b = (B*)((A*)new C()); // this is done manually, i believe it is safe
((C*)b)->SomeFunc(); // is this safe? this is the cast in question
return ((C*)((A*)b))->SomeFunc(); // this is done manually, i believe it is safe
}
Run Code Online (Sandbox Code Playgroud)
编辑:使该代码可编译且可运行
edit2:添加了更多评论