C ++,尝试打印整数时cout的奇怪行为

时间:2018-06-12 17:29:23

标签: c++

我试图编写一个在容器类中存储id和值的类。 我使用嵌套类作为我的数据结构。 当我编译代码有时它打印完美,有时它什么都不打印,有时打印一半的数据然后停止。 当我调试代码时,会出现同样奇怪的行为,当它在调试期间失败时会抛出错误“Map.exe触发了一个断点。”,当我使用cout时,错误在print方法中出现。

cmap.h

#pragma once


class CMap
{
public:
    CMap();
    ~CMap();
    CMap& Add(int id, int value);
    void print() const;


private:

    class container
    {
    public:
        ~container();
        int container_id = 0;
       int container_value = 0; 
    };
    container* p_komp_;
    int dim_ = -1;

    void resize();
};

cmap.cpp

#include "cmap.h"
#include <iostream>
using namespace std;



CMap::CMap()
{
    p_komp_ = new container[0];
}


CMap::~CMap()
{
    p_komp_ = nullptr;
    cout << "destroy cmap";
}


CMap& CMap::Add(int id, int value)
{
    resize();
    p_komp_[dim_].container_id = id;
    p_komp_[dim_].container_value = value;
    return *this;
}

void CMap::resize()
{
    container* temp_array = new container[++dim_];

    if (dim_ == 0)
    {
        temp_array[0].container_id = p_komp_[0].container_id;
        temp_array[0].container_value = p_komp_[0].container_value;
    }
    for (unsigned i = 0; i < dim_; i++)
    {
        temp_array[i].container_id = p_komp_[i].container_id;
        temp_array[i].container_value = p_komp_[i].container_value;
    }

    p_komp_ = temp_array;

}

void CMap::print() const
{

    for (unsigned i = 0; i <= dim_; i++)
    {    

        cout << p_komp_[i].container_id;
        cout << p_komp_[i].container_value;

    }
}


CMap::container::~container()
{
    cout << "destruct container";

}

Map.cpp

#include "cmap.h"
#include <iostream>

using namespace std;

    void main(void)
    {

        CMap m2;
        m2.Add(1, 7);
        m2.Add(3, 5);
        m2.print();
    }

1 个答案:

答案 0 :(得分:7)

这两件事可能是您遇到问题的原因:

int dim_ = -1;

container* temp_array = new container[++dim_];

分配时,您会将dim_-1增加到0。那就是你创建一个零大小的&#34;数组&#34;,其中每个索引都将超出界限并导致undefined behavior

你也有内存泄漏,因为你永远不会delete[]new[]。我没有找到更多问题,但可能还有更多。

&#34;数组&#34; (在编译时或通过new[]创建)将具有从0size - 1(包括)的索引。你似乎认为&#34;尺寸&#34;你提供的是最高指数。不是,它是元素的数量。

在我看来,你可能需要退一步,get a couple of good books to read,几乎重新开始。