1

假设我有一个类的对象,如下所示:

Myclass obj;

现在我想将此对象存储到我想要的内存位置。我怎样才能做到这一点?有没有可能?

我创建了一个数组类,它只是在相应的索引中插入整数类型的数据,但数组的大小未在类中声明。我插入了 50 到 60 个整数之类的少量数据,然后我使用循环在这个类中插入了一个大数据,但是这次我的程序崩溃了,我认为是因为如果在内存中遇到一些索引,它有一些值,程序自行停止。现在我想分析我的数组类对象从包含最大可用空可用内存空间的特定地址开始的内存

我认为由于分配了一些内存位置,它不允许更多的插入。现在我想将我的对象放在包含最大可用空可用空间的内存地址上。请指导我

#include<iostream>
using namespace std;

class newarray 
{
public:
    int n;
    int arr[]; //size not declared 
    int* ptr;

    newarray():n(0),ptr(NULL)
    {
    }

    void getadress(int indexno) //for getting address of an index
    {
        ptr=&arr[indexno];
        cout<<endl<<ptr;
    }

    void insert(int a) //inserting an element
    {
        arr[n]=a;
        n++;
    }

    void display()
    {
        for(int i=0;i<=n;i++)
        {
            cout<<endl<<arr[i];
        }
    }
};

int main()
{
    newarray a1;
    int x=1;

    for(int i=0;i<100;i++) //work good with 100 inssertions
    //but if exceed to 300 or more it crashes.
    {
        a1.insert(x);
        x++;
    }
    a1.display();
}
4

5 回答 5

2

new您可以使用带有内存地址的运算符将对象初始化到特定的内存位置,如下所示:

MyObject *obj = new(address) MyObject(arguments);

请注意,当像这样使用“new”时,您可能需要手动调用析构函数来运行其逻辑。

于 2022-01-17T09:13:03.520 回答
1

如果是变量,您永远无法选择内存位置。语言实现会为您解决这个问题,在理想情况下甚至可能根本不使用任何内存。

在动态对象的情况下,可以在您选择的内存位置创建对象 - 但有一些限制: 在内存映射系统(即任何现代操作系统)上,您只能使用已分配的内存。您通常无法选择分配所在的内存地址,但您可以在分配中选择创建动态对象的位置 - 只要地址满足类型的对齐要求。C++ 标准和操作系统都提供了许多分配内存的方法。


嵌入式系统可能是未映射内存的系统。在那里,您没有可以或需要从中分配内存的操作系统。

在这样的系统上,如果您控制硬件,您将知道哪些内存地址可以通过了解如何设置硬件来安全地创建对象。如果您不知道硬件是如何设置的,那么您必须阅读文档。

于 2022-01-17T09:21:21.787 回答
1

您不能在内存映射系统中选择任意地址并将对象存储在那里。您需要首先分配一个缓冲区(例如使用),然后使用放置new[]在该预分配缓冲区中构造您的对象。 new

这是一个简单的例子:

#include <iostream>
#include <cstddef>


class Myclass
{
public:
    int m_value;
};

int main( )
{
    std::byte* buffer  = new std::byte [ sizeof( Myclass ) ]; // allocate a buffer
    Myclass* ptr = new ( buffer ) Myclass( 123 ); // construct the object in
                                                  // that buffer

    std::cout << ptr->m_value << '\n'; // print the value for
                                       // demonstartion purposes

    ptr->~Myclass( ); // explicitly call the destructor
    delete [ ] buffer; // release the buffer
}

现在回到代码中的错误。问题是您arr没有固定的大小。这不好。取而代之的是使用 a std::vector,以便它可以在运行时通过在其背面插入元素来扩展自身。

这是您的程序的固定版本:

#include <iostream>
#include <vector>


class NewArray
{
public:
    NewArray( )
    : arr( 0 )
    {
    }

    void getAddress( const std::size_t idx ) // for getting address of an index
    {
        std::cout << '\n' << &arr[ idx ];
    }

    void insert( const int elem ) // inserting an element
    {
        arr.push_back( elem );
    }

    void display( )
    {
        for( const auto& elem : arr )
        {
            std::cout << '\n' << elem;
        }
    }

private:
    std::vector<int> arr;
};

int main( )
{
    NewArray a1;
    int num { 1 };

    for ( std::size_t i { }; i < 100; ++i )
    {
        a1.insert( num );
        ++num;
    }

    a1.display( );
}
于 2022-01-17T10:53:02.530 回答
1

你写了

 class newarray 
    {
    int arr[]; //size not declared

这是不允许的。不幸的是,您的编译器在编译时没有警告您。当您的代码崩溃时,您才发现这是一个问题。

然后,您想知道“一些分配的内存位置”并手动选择一个。那不是问题。int arr[]只有在少数情况下才允许不明确指定边界,例如函数声明。函数声明不需要大小,因为这种情况下的大小由调用者决定。

由于这是 C++,因此只std::vector<int>用于您的动态数组。

于 2022-01-17T12:35:05.017 回答
0

对象具有唯一的内存地址。一旦对象存在,您就无法更改它在内存中的存储位置。您可以创建一个副本并将该副本存储在其他位置,但您不能在创建该特定对象后将其存储在其他某个内存地址中。

于 2022-01-17T10:17:36.970 回答