【问题标题】:C++ memory allocation for objects pointers对象指针的 C++ 内存分配
【发布时间】:2012-10-21 15:56:40
【问题描述】:
#include <iostream>
using namespace std;

class test
{
public:
    int a,b[100];
    test() {
        cout << "Constructor called" << " \n " ;
        a=10;
    }
};

int main()
{
    test a1;    
    test *b2;      
    test *pointer = new test; 

    cout << a1.a << endl;
    cout << pointer->a << " \n ";
    cout << b2->a << " \n ";

    return 0;
}

我想知道上面的代码是否只创建了两个对象,分别是'a1'对象和'pointer'对象指针。我假设指针'b2'没有为它分配内存。在这种情况下,最后一个“ cout a ”应该会造成分段错误。我正在访问一个尚未分配内存的位置。但我没有得到分段错误。编译器只是打印一个随机值。

我的问题是“这里是三个对象分配内存还是只有两个”? 为什么没有分段错误?

【问题讨论】:

  • 只有两个对象,当你测试 *b2;这只是一个指针,只会分配内存,就像它会为 32 位的普通指针分配内存一样。

标签: c++ object memory pointers allocation


【解决方案1】:

a1 分配在自动内存中。

b2 不是一个对象(嗯,不是您定义的类型的对象),而是一个指针,它没有指向一个有效的位置。这是一个悬空指针,取消引用它会导致未定义的行为。任何事情都有可能发生。

pointer 是指向动态内存中对象的指针。它本身不是对象,而是指向new test创建的对象。

这里是三个对象分配内存还是只有两个

只有两个。

为什么没有分段错误?

因为未定义的行为意味着任何事情都可能发生。任何行为都符合标准。

【讨论】:

  • 嗯,指针仍然是一个对象,一个指针类型的对象。但我知道你的意思和你说它的方式,无论如何,对于 OP 来说理解起来可能会更好。
  • @Luchian, @ Christian - 非常感谢。我知道在“a1”的自动内存中分配了 404 个字节(int 为 4 个字节),而“指针”指向的“新测试”在动态内存中分配了 404 个字节。指针“b2”和“指针”在自动内存中仅分配 32 位用于存储地址。如果我错了,请告诉我。
  • @Raghav 这是一个实现细节,可能会有所不同(sizeof(int) 不必为 4),但是是的,类似的。
【解决方案2】:

我假设指针 b2 没有为它分配内存?

  • 一般在创建对象时会自动创建内存。

  • 在创建指向对象的指针时始终分配NULL,避免访问冲突。

例子:

       test *b2; //not safe

       test *b2 = NULL; // SAFE

希望对你有帮助。

【讨论】:

  • 在现代 C++ 中,您将使用 nullptr,而不是 NULL
猜你喜欢
  • 2017-12-06
  • 1970-01-01
  • 2016-02-21
  • 2021-11-29
  • 2018-08-11
  • 1970-01-01
  • 2016-02-03
  • 2013-05-06
相关资源
最近更新 更多