为啥我的对象会在 C++ 中被覆盖?

Posted

技术标签:

【中文标题】为啥我的对象会在 C++ 中被覆盖?【英文标题】:Why does my object get overwritten in C++?为什么我的对象会在 C++ 中被覆盖? 【发布时间】:2020-12-31 06:17:46 【问题描述】:

我正在尝试创建一个指向对象的指针网格。

为此,我创建了两个类,第一个称为 Pixel,存储像素的信息,第二个是 Grid 类,它的构造函数创建指向 Pixel 对象的指针矩阵。

当我实例化一个像素对象和一个网格对象时,问题就出现了,像素对象被覆盖了。

#include <iostream>
#include <vector>

class Pixel
    private:
        char cel_type;
    public:
        Pixel(void)cel_type = 'O';;
        Pixel(char _type)cel_type = _type;;
        char getType()return cel_type;
        ~Pixel();
;

class Grid
    private:
        int rows, cols;
        Pixel  g[0][0], *p[0][0];
    public:
        Grid(int, int); //create the grid

;

Grid::Grid(int M, int N)
    Pixel p0('C'), *pt; 
    rows = M;
    cols = N;
    
    for (int i = 0; i < cols; i++) 
        for (int j = 0; j < rows; j++) 
            g[i][j] = p0; // THE PROBLEM ?
            p[i][j] = &p0;

        ;
    ;
    
;

int main()
    int M = 3, N = 4;
    Pixel p1('A'), p2('B');
    std::cout<<"Before: "<<p1.getType()<<p2.getType()<<std::endl;
    Grid g(M,N);
    std::cout<<"After: "<<p1.getType()<<p2.getType()<<std::endl;
    
; 

这应该打印出来:

之前:AB 之后:AB

但相反,它给出了:

之前:AB 之后:C

为什么 p1 和 p2 会被覆盖?

【问题讨论】:

【参考方案1】:

在 Grid 构造函数中,p0 是一个局部变量。它在构造函数结束时消失。 &p0 是局部变量的地址。当构造函数结束时,它指向随机垃圾。因此,您存储到 p 中的任何内容都是垃圾指针。

但情况更糟。您将 g 和 p 声明为大小为 0 的数组。(为什么您的编译器甚至允许这样做?)因此,当您初始化 Grid 时,它会存储大量像素和指针,天知道在哪里。

【讨论】:

以上是关于为啥我的对象会在 C++ 中被覆盖?的主要内容,如果未能解决你的问题,请参考以下文章

为啥只有当我覆盖它时,我的 UINavigtionController 栏才会在 iOS 7 上错误地定位? [复制]

C++ 指针在 for 循环中被覆盖

为啥我的类节点会覆盖自己而不是创建新的节点对象

我想通过Python中的子类对象调用在子类中被覆盖的父类方法

为啥在 C++ 中覆盖是可选的?

我的 CSS 在 React 项目中被 Bootstrap 覆盖