我有一个包含对象指针数组的类作为其成员变量。我目前在让编译器将对象复制到数组末尾时遇到问题,因为当我逐步执行程序时,对象数组会读取其内存无法读取。任何人都知道问题可能是什么?
void Notifications::operator+=(const iMessage& src) {
iMessage** temp2 = nullptr;
temp2 = new iMessage*[size+1];
if (size != 0){
for (int i = 0; i < size; i++) {
*temp2[i] = *messages[i];
}
}
*temp2[size] = src; //compiler states that it cannot read the data from temp2 after this point
delete[]messages;
for (int i = 0; i < size + 1; i++) {
*messages[i] = *temp2[i]; //Unhandled exception at 0x00C58F99 in w5.exe: 0xC0000005: Access violation reading location 0x00000000.
}
size++;
}
Notifications.h
#include "iMessage.h"
#include <vector>
namespace w5 {
class Notifications {
int size;
iMessage **messages;
public:
Notifications();
Notifications(const Notifications&);
Notifications& operator=(const Notifications&);
Notifications(Notifications&&);
Notifications&& operator=(Notifications&&);
~Notifications();
void operator+=(const iMessage&);
void display(std::ostream&) const;
};
}
IMessage.h
#ifndef _I_MESSAGE_H_
#define _I_MESSAGE_H_
// Workshop 5 - Containers
// iMessage.h
#include <iostream>
#include <fstream>
namespace w5 {
class iMessage {
public:
virtual void display(std::ostream&) const = 0;
virtual iMessage* clone() const = 0;
virtual bool empty() const = 0;
};
iMessage* getMessage(std::ifstream&, char);
}
#endif
Message.h
#include "iMessage.h"
namespace w5{
class Twitter : public iMessage {
std::string msg;
public:
Twitter(char, std::ifstream&);
virtual void display(std::ostream&) const;
virtual iMessage* clone() const;
virtual bool empty() const;
};
class Email : public iMessage {
std::string msg;
public:
Email(char, std::ifstream&);
virtual void display(std::ostream&) const;
virtual iMessage* clone() const;
virtual bool empty() const;
};
}
答案 0 :(得分:0)
首先你做
delete[]messages;
然后你做
*messages[i] = *temp2[i];
尝试访问刚刚删除的阵列。我想你只想把指针指向你刚刚创建的数组:
messages = temp2;
你也做
*temp2[size] = src;
当temp2[size]
没有指向任何内容时。那应该是
temp2[size] = src.clone();
制作参数的持久副本并将其存储在数组中。
跟随这个奇怪的指针 - 玩杂耍是相当棘手的;我想你也想在messages
之前删除messages
的每个元素以避免泄漏。为什么不使用std::vector
来为您处理内存分配?这将减少整个疯狂的舞蹈
std::vector<std::unique_ptr<iMessage>> messages;
void operator+=(const iMessage & src) {
messages.emplace_back(src.clone());
}
此外,_I_MESSAGE_H_
是reserved name。你应该删除前导下划线。
答案 1 :(得分:0)
1)只需使用vector
。
2)你应该总是发布确切的编译器消息。 &#34;编译器声明它在此点之后无法从temp2读取数据&#34;不够好。
3)你分配一个指针数组,然后取消引用那些指针,但你永远不会让指针指向任何地方。
4)删除messages
数组,然后继续复制回来,就像它仍然存在一样。 (您实际想要做的只是分配messages = temp2
。)
5)通过使用赋值来尝试复制iMessage
个对象,您可以在整个地方切片对象。 iMessage
具有clone()
功能的原因。
答案 2 :(得分:0)
您想将const引用转换为非const指针。 我想知道编译器不会抛出错误。你使用哪个编译器?
这样的事情不可能吗?
void Notifications::operator+=(iMessage* src) {
我没有测试,但这也应该有效:
void Notifications::operator+=(iMessage& src) {
*bar[foo] = &src;