我试图编写一个在容器类中存储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();
}
答案 0 :(得分:7)
这两件事可能是您遇到问题的原因:
int dim_ = -1;
和
container* temp_array = new container[++dim_];
分配时,您会将dim_
从-1
增加到0
。那就是你创建一个零大小的&#34;数组&#34;,其中每个索引都将超出界限并导致undefined behavior。
你也有内存泄漏,因为你永远不会delete[]
你new[]
。我没有找到更多问题,但可能还有更多。
&#34;数组&#34; (在编译时或通过new[]
创建)将具有从0
到size - 1
(包括)的索引。你似乎认为&#34;尺寸&#34;你提供的是最高指数。不是,它是元素的数量。
在我看来,你可能需要退一步,get a couple of good books to read,几乎重新开始。