我试图编写一个在容器类中存储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();
};
Run Code Online (Sandbox Code Playgroud)
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";
}
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
这两件事可能是您遇到问题的原因:
int dim_ = -1;
Run Code Online (Sandbox Code Playgroud)
和
container* temp_array = new container[++dim_];
Run Code Online (Sandbox Code Playgroud)
分配时,dim_从-1增加到0.那就是你创建一个零大小的"数组",其中每个索引都将超出界限并导致未定义的行为.
你也有内存泄漏,因为你永远不会delete[]是你new[].我没有找到更多问题,但可能还有更多问题.
和"阵列"(在编译时或通过创建new[])将具有索引从0到size - 1(含).您似乎认为您提供的"大小"是最高指数.它不是,它是元素的数量.
在我看来,你可能需要退一步,拿几本好书来阅读,几乎重新开始.
| 归档时间: |
|
| 查看次数: |
112 次 |
| 最近记录: |