小编bjs*_*123的帖子

堆栈内存由动态分配的对象成员变量引用

我有以下代码

class Test
{
public:
    int &ref;
    int a;

    Test(int &x)
        :ref(x)
    {
        cout<<"Address of reference "<<&ref<<endl;
        cout<<"&a : "<<&a<<endl;
        cout<<"this = "<<this<<endl;
    }
};

int main()
{
    Test *pObj = NULL;
    {
        int i = 10;
        cout<<"Address of referent "<<&i<<endl;
        pObj = new Test(i);
    }
    pObj->ref++;
    cout<<pObj->ref;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

Address of referent 002DFB3C

Address of reference 002DFB3C

&a : 00734C94

this = 00734C90
Run Code Online (Sandbox Code Playgroud)

如您所见,Test对象是动态创建的.存储在堆栈中的变量i作为参数发送到Test类的构造函数.我打印了变量i,ref和a的地址.

问题:一旦程序控制退出声明它的块,变量i将被销毁.但动态分配对象的成员变量ref仍然会引用堆栈地址(i的地址).能够在我死后使用ref.

为什么堆对象有引用堆栈内存?为什么允许这样做?

c++ visual-studio-2008

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

明确的模板专业化问题

template <class T>
class Test
{
public:
    template<class U> void f(); //generic function

    template<> void f<char>(); //Specialization for char.
};

template <class T>
template<class U> 
void Test<T>::f()   //Definition of generic function
{
}

template<>
template<> void Test<char>::f<char>(){}  //Definition of specialization.

int main()
{
    Test<char> ob1;
    ob1.f<char>(); //Works fine.

    Test<int> ob2;
    ob2.f<char>();  //Produces linker error.
}
Run Code Online (Sandbox Code Playgroud)

链接器错误是

error LNK2019: unresolved external symbol "public: void __thiscall
Test<int>::f<char>(void)"
Run Code Online (Sandbox Code Playgroud)

我的要求是:我应该能够将任何类型传递给Test类,并将任何类型传递给函数f().我应该可以使用下面所有类型的组合.

  Test   f()
  --------------
  int    char
  char   int
  int    int
Run Code Online (Sandbox Code Playgroud)

我可以通过定义下面的另一个函数来解决错误.

template<>
template<> void Test<int>::f<char>(){} …
Run Code Online (Sandbox Code Playgroud)

c++

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

是否可以像DLL一样动态链接lib?

这是面试问题.

是否可以像DLL一样动态链接lib?

例如,对于DLL,我们使用LoadLibrary并调用导出的函数.是否可以以相同的方式使用lib文件?

c++ static-libraries

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

多个返回语句与多个goto语句:哪一个更可取?

我读到多个返回和多个goto语句都是糟糕的编程习惯.我有一个功能,可以检测到8种类型的错误.如果出现错误,我应该返回错误代码还是应该使用goto statment转到函数结束并从那里返回.每当从函数返回之前需要释放内存时,我认为最好有一个goto结束并在函数结束时释放内存(这样只有一个空闲就足够了)

但是,在我的函数中,没有分配内存.在这种情况下哪一个更好?多个返回或多个goto语句?或者我们可以避免两者吗?

编辑:避免两者的一些方法是,将参数传递给可以存储errorType的函数.在继续进行之前,可以在功能内检查相同内容.但这也使代码变得丑陋.

c++

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

当函数参数需要Abstract类对象时,为什么使用pass by value会有危险?

我在Addison Wesley常见问题解答中阅读以下声明.

注意:在某些情况下,按值传递对象可能很危险.通过引用到const传递对象通常比通过值传递它们更好.例如,如果目标类型是抽象基类,则pass-by-value将不起作用,并且如果参数的类具有派生类,则可能在运行时导致错误行为.但是,如果保证参数的类不具有派生类,并且被调用的函数需要使用本地副本,则pass-by-value可能很有用.

如果目标类型是Abstract类并且参数的类具有派生类,那么它在运行时的错误行为如何?复制构造函数是否解决了这个问题?如果是这样,怎么样?谢谢.

编辑:那么,上述陈述是否应该是"编译时的错误行为"?不是"运行时".

c++

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

如何重载==运算符以允许它用于多重比较?

我试图重载==运算符来比较下面的对象.

class A
{
    int a;
public:
    A(int x) { a = x; }
    bool operator==(const A& obRight)
    {
        if(a == obRight.a)
        {
            return true;
        }
        return false;
    }
};

int main()
{
    A ob(10), ob2(10), ob3(10);
    if(ob == ob2) // This equality comparison compiles fine.
        cout<<"Equal"<<endl;
     if(ob == ob2 == ob3) //This line doesn't compile as overloaded 
                          // == operator doesn't return object (returns bool)
           cout<<"Equal"<<endl;
}
Run Code Online (Sandbox Code Playgroud)

如上所述,我无法在单行中进行多个对象比较,
例如 if(ob == ob2 == ob3)通过成员函数使用重载==运算符.

我应该使用友方功能超载吗?

c++ operator-overloading

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

为什么const_cast没有修改调用函数中的值?

对于以下片段,

#include <iostream>
using namespace std;

void fun(const int *p)
{
    int *q = const_cast<int *>(p);
    *q = *q * 10;
    cout<<"q: "<<q<<"\t Value: "<<*q<<endl;
}

int main()
{
    const int a = 10;
    const int *z = &a;
    fun(z);
    cout<<"z: "<<z<<"\t"<<"Address of a: "<<&a<<endl;
    cout<<"value at z: "<<*z<<"\t\t value in a: "<<a<<endl;
}
Run Code Online (Sandbox Code Playgroud)

产生的产量是

q: 0x7fff65910fcc    Value: 100
z: 0x7fff65910fcc   Address of a: 0x7fff65910fcc
value at z: 100      value in a: 10
Run Code Online (Sandbox Code Playgroud)

为什么即使我试图在fun()中修改它,a的值也没有被修改?

为什么a和指针z的地址相同但值不同?

是const_cast的某种未定义行为吗?

c++ linux const

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

无法在Visual Studio中观察变量值,并将编译器优化设置为最大化速度(/ O2)

我正在使用Visual Studio 2008中的c ++应用程序我用Maximize speed(/ o2)构建了我的项目(来自属性 - >配置属性 - > c/c ++ - >优化 - >优化)无法观察变量值调试代码.请帮忙.

c++ visual-studio-2008

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

它是如何工作的,Test*pObj = new Test(); 因为构造函数不返回任何内容

我想在c ++上做得更好.我在main()中有一个Test类和下面的代码.

Test *pObj = new Test();
Run Code Online (Sandbox Code Playgroud)

如果我们通过逐步逐步调试来调试,首先它转到新函数来分配内存,然后调用构造函数.然后它回到main()函数.众所周知,构造函数不会返回任何内容.在那种情况下,为什么pObj将具有由new分配的指针?知道编译器是如何实现的吗?

c++

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

如何转换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
查看次数