在方法范围之外的解除引用的char []指针的有效性

时间:2016-06-06 14:54:55

标签: c++ string pointers

我的嵌入式系统(Arduino)上有一个损坏的char [],我怀疑是一部分代码。这是代码(好吧,我试图概念化它,我没有尝试编译你读的内容)。 基本上,问题是:我可以在方法范围外存储指向“abcde”对象的指针(我不知道如何命名“abcd”,它是一个常量的char数组吗?)

class A {
    public:
    void store(char *ptr_char) {
        m_ptr=ptr_char;
    }
    void useit() {
        // is *m_ptr valid here ?
        printf("%s",m_ptr);
    }

private :
    char *m_ptr;
}

class B :  A {
    void remember() {
        store ("string to remember");
    }
}

main () {
    B obj;

    obj.remember();
    obj.useit();
}

我观察到* m_ptr内存的损坏,“要记住的字符串”在现实代码中被破坏(内存中的其他对象)。 我的C个人记忆告诉我,保持对未分配对象的引用是无效的。我记得,在记住()方法执行时,“要记住的字符串”在堆栈中,但是在退出remember()之后没有保证可用,对吧?

整个问题是:我不知道C ++如何在引号之间处理这些事情:)

1 个答案:

答案 0 :(得分:3)

除了您的代码段不能是真正的测试用例(因为A没有名为remember()的成员函数),没有任何根本错误用你向我们展示的东西。您正在存储指向字符串文字的指针,字符串文字将永远存在。

但是,您的编译器应该警告您将其存储为const char* - 从2011年开始它实际上是非法的。

很可能你正在破坏这个文字占用的内存,而且如果没有MCVE,我们就无法知道如何。 也许,在您添加了缺失的const后,您的编译器可以为您捕获错误。但这绝不是保证。

另外,请不要忘记main的返回类型。