小编use*_*208的帖子

C++对象作为返回值:复制还是引用?

我想测试当函数的返回值是一个对象时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)

c++ memory return object

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

lambda的捕获机制

我无法理解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)

所以我的问题是:

  1. 这是理想的行为吗?
  2. 如果我在ClassA中使用[&]而不是[=],那些lambdas是否相同?
  3. 是否有一些关于何时[=]实际制作副本的一般规则?
  4. 究竟是什么时候应该发生lambda的变量捕获?
  5. 我可以强制lambda重新捕获变量吗?

谢谢

c++ lambda

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

浮点运算结果的再现性

浮点算术运算是否有可能在不同的CPU上产生不同的结果?CPU是指x86和x64的全部内容.并且通过不同的结果,我的意思是即使只有一个最不重要的位是不同的.我需要知道我是否可以在项目上使用浮点运算,这对于在不同的机器上具有与相同输入相对应的完全相同的结果是至关重要的.

编辑:添加了c ++标签.
还要澄清一下:我需要可重复的结果运行时间.我不希望不同编辑的结果相同.

c++ floating-point fixed-point

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

两个派生类之间的转换

在具有共同祖先的类上的指针之间进行转换是否合法?编译器是否注意到这种层次结构并确保其安全(调用 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:添加了更多评论

c++ casting class

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

标签 统计

c++ ×4

casting ×1

class ×1

fixed-point ×1

floating-point ×1

lambda ×1

memory ×1

object ×1

return ×1