C ++:编译器无法读取对象数组

时间:2014-12-04 13:18:14

标签: c++ arrays pointers

我有一个包含对象指针数组的类作为其成员变量。我目前在让编译器将对象复制到数组末尾时遇到问题,因为当我逐步执行程序时,对象数组会读取其内存无法读取。任何人都知道问题可能是什么?

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;
    };
}

3 个答案:

答案 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;