在动态分配的指针数组中扩展内存
Expanding memory in a dynamically allocated pointer array
当我添加一个对象时,我试图让我的数组扩展。但它行不通。我一直在搜索和搜索,但找不到问题...对于训练有素的眼睛来说,这不是一项艰巨的任务,所以我想我可以问你们。我有两个类,其中类Timber
链接到TimberRegister
,但Timber
看不到TimberRegister
,而TimberRegister
可以看到它。我认为向您展示TimberRegister
和主文件的cppfile应该足够了,因为我很确定其他文件是okey并且不会影响错误,这似乎是toString
无法写入第三个对象,因为它没有内存。
#include "timberRegister.h"
#include <iostream>
int main() {
TimberRegister oak("Oak");
oak.addTimber("20x10", 4, 10.50);
oak.addTimber("28x14", 4, 15.00);
oak.addTimber("15x5", 2, 5);
int nrOf = oak.getNrOfTimber();
string* str = new string[nrOf];
oak.getTimberAsString(str, nrOf);
cout << oak.getTitle() << endl;
for (int i = 0; i < nrOf; i++) {
cout << str[i] << endl;
}
return 0;
}
#include "timberRegister.h"
void TimberRegister::expand() {
this->capacity += 10;
Timber* *tmp = new Timber*[capacity];
for (int i = 0; i < this->nrOfTimber; i++) {
tmp[i] = this->timber[i];
}
delete[] this->timber;
this->timber = tmp;
this->initiate(this->nrOfTimber);
}
void TimberRegister::initiate(int from) {
for (int i = 0; i < this->capacity; i++) {
this->timber[i] = nullptr;
}
}
void TimberRegister::freeMemory() {
for (int i = 0; i < this->nrOfTimber; i++) {
delete this->timber[i];
}
delete[] this->timber;
}
int TimberRegister::find(string dimension, int meters, double price) {
int place = -1;
Timber tmp(dimension, meters, price);
for (int i = 0; i < this->nrOfTimber && place == -1; i++) {
if (*this->timber[i] == tmp) {
place = i;
}
}
return place;
}
TimberRegister::TimberRegister(string title) {
this->title = title;
this->nrOfTimber = 0;
this->capacity = 2;
this->timber = new Timber*[this->capacity];
for (int i = 0; i < capacity; i++) {
this->timber[i] = nullptr;
}
this->initiate(this->nrOfTimber);
}
TimberRegister::TimberRegister(const TimberRegister &origObj) {
if (this != &origObj) {
this->title = origObj.title;
this->nrOfTimber = origObj.capacity;
this->timber = new Timber*[origObj.capacity];
for (int i = 0; i < origObj.nrOfTimber; i++) {
this->timber[i] = new Timber(*origObj.timber[i]);
}
this->initiate(origObj.getNrOfTimber());
}
}
TimberRegister::~TimberRegister() {
this->freeMemory();
}
TimberRegister TimberRegister::operator=(const TimberRegister & origObj) {
this->freeMemory();
this->title = origObj.title;
this->nrOfTimber = origObj.nrOfTimber;
this->capacity = origObj.capacity;
this->timber = new Timber*[origObj.capacity];
for (int i = 0; i < origObj.capacity; i++) {
this->timber[i] = new Timber(*origObj.timber[i]);
}
this->initiate(origObj.getNrOfTimber());
return *this;
}
bool TimberRegister::addTimber(string dimension, int meters, double price) {
bool added = false;
if (this->existTimber(dimension, meters, price) == false) {
if (this->nrOfTimber >= this->capacity) {
this->expand();
}
this->timber[nrOfTimber++] = new Timber(dimension, meters, price);
added = true;
}
return added;
}
bool TimberRegister::removeTimber(string dimension, int meters, double price) {
bool removed = false;
int tmp = -1;
tmp = this->find(dimension, meters, price);
if (tmp != -1) {
delete this->timber[tmp];
this->timber[tmp] = this->timber[--this->nrOfTimber];
removed = true;
}
return removed;
}
bool TimberRegister::existTimber(string dimension, int meters, double price) {
bool found = false;
Timber tmp(dimension, meters, price);
for (int i = 0; i < nrOfTimber && found == false; i++) {
if (*this->timber[i] == tmp) {
found = true;
}
}
return found;
}
int TimberRegister::getNrOfTimber() const {
return this->nrOfTimber;
}
string TimberRegister::getTitle() const{
return this->title;
}
void TimberRegister::setTitle(string title) {
this->title = title;
}
void TimberRegister::clear() {
freeMemory();
this->timber = new Timber*[capacity];
}
void TimberRegister::getTimberAsString(string arr[], int nrOf) const {
for (int i = 0; i < nrOf; i++) {
arr[i] = this->timber[i]->toString();
}
}
但它行不通。我一直在寻找和搜索,但找不到问题。
我注意到的一个问题:
void TimberRegister::initiate(int from) {
for (int i = 0; i < this->capacity; i++) {
this->timber[i] = nullptr;
}
}
在该函数中,您将使所有指针nullptr
。您需要使用:
void TimberRegister::initiate(int from) {
for (int i = from; i < this->capacity; i++) { // i = from, not i = 0
this->timber[i] = nullptr;
}
}
首先,就像评论指出的那样:
std::vector
可能是更好的解决方案。
其次,我建议统一缩进您的代码以使其更易于阅读。
最后,(如果您的表总是以空指针结束)我认为这就是问题所在:
void TimberRegister::initiate(int from) {
for (int i = 0; i < this->capacity; i++) {
this->timber[i] = nullptr;
i
不应该从from
开始吗?即 int i = from
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- static_assert在宏中,但也可以扩展到可以用作函数参数的东西
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- C++ Python 的扩展 - 安全内存访问和内存布局
- 如何在源代码中使用执行策略检测 C++17 的扩展内存管理算法的可用性?
- 在动态分配的指针数组中扩展内存
- Python C++扩展 - 内存泄漏或访问冲突
- NUMA体系结构上大(8MB)内存区域的可扩展分配
- 为内存管理扩展GCC
- SQLite是否使用SQLCipher扩展泄漏内存
- 在WinAPI、POSIX或API-OS等价物的其他扩展中,是否存在来自C++11的所有级别的内存屏障
- 如何创建一个可以随时间扩展的共享内存区域?
- 松弛的内存顺序效果是否可以扩展到执行线程的生命周期之后?
- 嵌入扩展python会占用所有内存