小编Sta*_*ack的帖子

内存分配堆栈

在堆栈中,保留了内存main,我们称之为main函数的堆栈帧.

当我们调用该Add函数时,内存保留在堆栈顶部.在Add函数的堆栈帧,a并且b是本地指针和c是计算的整数,然后我们返回参考.cAdd函数的局部变量.

现在当Add函数执行完成时,堆栈中的内存空间也被释放,所以当我们尝试在mainwith指针中访问这个地址时p,我们试图访问的内容基本上是一个释放空间.编译器发出警告,但为什么它仍然正确打印值5?

答案可能是机器没有释放内存空间,因为它没有必要,因为没有更多的功能.但是如果我们编写另一个函数,Hello那么它肯定应该释放Add调用堆栈中的函数空间,但程序仍会打印

Yay     5
Run Code Online (Sandbox Code Playgroud)

是因为像在堆中我们需要null在释放它之后指定一个指针,否则我们仍然可以访问它?有类似的东西吗?

/* void Hello()
   {
     printf("Yay");
   } */

int* Add(int *a,int *b)
{
  int c=*a+*b;
  return &c;
}

int main()
{
  int a=1,b=4;
  int *p=Add(&a,&b);
  // Hello();
  printf("\t%d",*p);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c c++ pointers memory-management dangling-pointer

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

C++中的早期和晚期绑定+多态性

假设没有 Hello 函数,我们只是在 main 中调用 ob.display ,然后它调用 B 类而不是 A 类的显示函数。

函数 display() 的调用由编译器设置为基类中定义的版本一次。这称为函数调用的静态解析,或静态链接——函数调用在程序执行之前就被固定。这有时也称为早期绑定,因为 display() 函数是在程序编译期间设置的。

现在如何在基类中的显示函数之前不使用 virtual 关键字(后期绑定)来调用派生类的显示函数?

现在,在这个程序中,将对象作为按值调用、按指针调用和按引用调用 Hello 函数进行传递都可以正常工作。现在,如果我们使用多态性并希望在调用派生类的成员函数时显示它,我们必须在基类中的显示函数之前添加 virtual 关键字。如果我们通过指针调用和引用调用来传递对象值,它会调用派生类中的函数,但如果我们通过值传递对象,则不会,为什么会这样?>

class A
{
   public:
      void display();                       // virtual void display()
       {
        cout << "Hey from A" <<endl;
       }
};

class B : public A
{
    public:
        void display()
        {
            cout << "Hey from B" <<endl;
        }
};

void Hello(A ob) // &ob  //*ob
{
   ob.display();       // ob->display()
}

int main()
{
    B obj;
    Hello(obj); // obj …
Run Code Online (Sandbox Code Playgroud)

c++ polymorphism binding

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

c ++中的new运算符+默认构造函数

这里已经讨论了这个问题[链接] new []是否在C++中调用默认构造函数?

作为一个初学者和一个自学者,将赞赏积极的评论,请不要将其概括为广泛,狭隘等

当我们使用new []时,每个元素都由默认构造函数初始化,除非类型是内置类型.默认情况下,内置类型保持单一化.

这里有人说默认构造函数初始化对象是什么意思?是不是每个对象现在都将键初始化为零(由默认构造函数),因为当我打印p [2] .key时这是真的?

如何检查默认构造函数是否初始化数组或不是int数组,它无法访问main中的成员键?

另外(i)打印垃圾值,但(ii)打印0;

class People
{
    public:
      int key;
    People()
    {
        key=0;
    }
};

int main()
{
   int count=5;
   People *p=new People[count];
   cout<< p[2].key;

   // int *arr=new int[count]; ...(i)
   //cout<<*(arr+2);

  //int *arr=new int[count](); ... (ii)
 //cout<<*(arr+2)<<endl;

 return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

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

c ++中的静态成员函数错误

如果静态类成员和静态类函数有类范围,那么为什么我不能访问显示函数(它显示错误)?如果代替显示功能我写入计数它显示正确的值,即0

#include <iostream>
#include <string> 

using namespace std;

class Person
{
    public:
     static int Length;
     static void display()
     {
        cout<< ++Length;
     }
};

int Person::Length=0;

int main()
{
   cout<< Person :: display(); //error
   // Person :: Length shows correct value
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++

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

c中的初始化和赋值

如果分配可以多次完成,那么为什么它会显示错误.如果相同的代码在main中,则没有显示错误.

#include <stdio.h>
  int arr[2]; // array elements are initialized as zero
  arr[0]=5;
  arr[1]=10;
int main()
{ 
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c

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