c++ - 为什么我们能够访问类中未分配的内存?

标签 c++ new-operator

很抱歉,如果我没有正确地表达问题,但在以下代码中:

int main() {
char* a=new char[5];
a="2222";
a[7]='f';     //Error thrown here
cout<<a;
}

如果我们试图访问程序中的 a[7],我们会得到一个错误,因为我们还没有被分配 a[7]。

但是如果我在类里面做同样的事情:

class str
{
public:
    char* a;
    str(char *s) {
        a=new char[5];
        strcpy(a,s);
    }
};
int main()
{
    str s("ssss");
    s.a[4]='f';s.a[5]='f';s.a[6]='f';s.a[7]='f';
    cout<<s.a<<endl;
    return 0;
}

代码有效,打印字符“abcdfff”。 当我们只将 char[5] 分配给我们在第一个程序中无法这样做的一段时间时,我们如何能够访问代码中的 a[7] 等?

最佳答案

在你的第一种情况下,你有一个错误:

int main() 
{
    char* a=new char[5];   // declare a dynamic char array of size 5
    a="2222"; // assign the pointer to a string literal "2222" - MEMORY LEAK HERE
    a[7]='f';     // accessing array out of bounds!
    // ...
}

你正在制造内存泄漏,然后询问为什么未定义的行为是未定义的。

你的第二个例子再次询问,为什么未定义的行为是未定义的。

关于c++ - 为什么我们能够访问类中未分配的内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18901598/

相关文章:

c++ - 你如何确定你在 yaml-cpp 中处理的是哪种节点?

c++ - 将字符串传递给接受指向 char 的指针的函数

c++ - 引用 init 两次 cpp

c++ - 如何理解新的运算符(operator)重载?

c++ - C++中模板对象的动态数组

c++链表模板和节点

c++ - cpp 中的宏编译错误 (Visual Studio 2012)

c++ - 重载运算符 new[] 的行为取决于析构函数

c++ - 如何称呼某事。 else 除了带有 new[] 运算符的类的默认构造函数之外

c# - 将 'New' 数组从 VB.Net 转换为 C#