在方法中分配指针是否退出方法?

问题描述 投票:0回答:4

我正在尝试学习c ++中的面向对象的编程,并且无法理解为什么以下代码无法打印出嗨:

#include <iostream>

class test{
    double* x;
    double y=5;
    public:

        void printhi(){
            *x=y;
            std::cout<<"hi";
        }

};

int main(){
    test a;
    a.printhi();

    return 1;
}

此代码没有给我任何输出。如果仅删除指针分配,则std::out<<"hi";运行良好。为什么?在此分配指针对计算机意味着什么?

c++
4个回答
1
投票

您的代码具有未定义的行为。

*x=y;

您正在取消引用尚未初始化的指针。在取消引用之前,指针必须指向某物。


1
投票

成员x没有初始化程序。因此,如果该类是默认初始化的,它将是默认初始化的。默认的初始化指针具有不确定的值。

尝试通过不确定的指针分配不存在的对象,或者甚至读取不确定的值具有未定义的行为。

在那里分配指针对计算机意味着什么?

您尚未分配指针。您已通过指针进行了间接操作,并分配了指向的对象。除了没有指针指向以外,因为指针具有不确定的值。该程序的行为是不确定的。

如果我只是删除指针分配,则std :: out <

如果删除未定义的行为,则该程序的行为将与您期望的一样。

我以为* x = y和x =&y是相同的分配

完全没有。首先,通过指针x进行分配,并将指向的对象修改为与对象y相同的值。第二个修改指针x指向对象y

但x具有无法确定的不确定值

可以指定一个不确定的值。赋值后,该值将不再是不确定的。这就是x=&y具有明确定义的行为的原因。它分配指针。

也就是说,将对象指针成员指向另一个成员的有用性尚不明确。


0
投票

您需要在对象的构造函数中初始化x

    test::test()
{
x = new double;
}

此外,由于您要声明原始指针(在大多数情况下不建议使用,所以不要忘记删除它,以免破坏内存以免发生任何内存泄漏:

  test::~test()
{
delete x;
}

所以您的课程至少应该有:

    class test {
    double* x;
    double y = 5;
public:

    test();

    ~test();

    void printhi() {
        *x = y;
        std::cout << "hi";
    }

};

0
投票

我已通过将* x = y更改为x =&y来解决此问题。为什么这样做更好?我认为这些是2个等效的作业。

它们是完全不同的两件事。

x = &y使指针x指向变量y。没关系。太好了。

*x = yy的值分配给“ x指向的任何内容”。除了x指向什么都没有,因为您从未让它这样做。您可以为它动态地分配一个double指向它,然后分配给它,但是尚不清楚这是您想要做的。

不幸的是,您没有告诉我们您要做什么,所以我们不能说哪种是适合您的解决方案。

就像您在代码中一样,未定义行为的一个可能结果是,其他似乎理智的代码突然“不起作用”。您正在写“随机”内存,应该习惯于不要奇怪,这会导致奇怪的发生(例如cout没有结果)。

© www.soinside.com 2019 - 2024. All rights reserved.