相关疑难解决方法(0)

C ++“新”运算符-使用方式?

最近,我遇到了对new运算符的异常使用,以重新初始化C ++类,其代码如下:

#include <iostream>
struct Test { Test() { std::cout<<"Test Ctor\n"; }  };
int main()
{
  Test t ;
  new (&t) Test;
  return 0 ;
}
Run Code Online (Sandbox Code Playgroud)

如果运行此代码,则会两次调用Test ctor。在这种情况下,似乎“ new”运算符正在使用指向对象的指针作为内存源,而不是分配新内存,valgrind确认没有内存泄漏。

有人可以阐明“新”运算符的用法吗?

c++ new-operator

3
推荐指数
1
解决办法
172
查看次数

用于C++的分层内存分配器库

我的应用程序主要是分层组织的,所以我发现像APR内存池这样的东西是最好的方法.

虽然在这里这里阅读关于C++ placement new帖子的SO ,以及一个更通用的C分配问题,我正在考虑手工制作分层池分配器,如同一篇文章中所建议的那样,但在纯NYI传统中,我首先要问的是这样的事情是否已经存在.

它还可以具有能够将未使用的内存返回给OS的良好属性(因为可以完成分配mmap(MAP_ANON)),或者可以像这里建议的Ferrucico那样从堆栈分配.

c++ memory-management hierarchical

2
推荐指数
1
解决办法
1685
查看次数

对于具有运算符new重载的类,我可以使用全局运算符new吗?

假设我有一个超载的类operator new.

class Class {
public:
   void* operator new( size_t );
   void operator delete( void* );
};
Run Code Online (Sandbox Code Playgroud)

operator new当我使用时,该类的对象是否总是与重载一起分配,new Class()或者operator newnew Class()构造出现在代码中时是否可能使用默认值?

c++ memory-management operator-overloading

2
推荐指数
1
解决办法
316
查看次数

这个"新"语法是什么意思?

最近我读了一段这样的代码:

template <unsigned long size>
class FooBase
{
  bool m_bValid;
  char m_data[size];
};

template <class T>
class Foo : public FooBase<sizeof(T)>
{
  // it's constructor
  Foo(){};
  Foo(T const & t) {construct(t); m_bValid = (true);}

  T const * const GetT() const { return reinterpret_cast<T const * const>(m_data); }
  T * const GetT() { return reinterpret_cast<T * const>(m_data);}

  // could anyone help me understand this line??
  void construct(T const & t) {new (GetT()) T(t);}
};
Run Code Online (Sandbox Code Playgroud)

我已经对代码进行了切片以确保它并不复杂,主要问题是关于construct(T const & t)函数.

什么 …

c++ syntax new-operator

2
推荐指数
1
解决办法
271
查看次数

make_shared"证据"与默认构造

make_shared为对象和引用计数器分配单个块.因此使用这种技术有明显的性能优势.

我在VS2012进行了简单的实验,我正在寻找"证据":

std::shared_ptr<Test> sp2 = std::make_shared<Test>();
std::shared_ptr<Test> sp(new Test());
// Test is a simple class with int 'm_value' member
Run Code Online (Sandbox Code Playgroud)

调试时我在本地查看这样的东西(删除了一些行)

-   sp2 shared_ptr {m_value=0 }  [make_shared] std::shared_ptr<Test>
+   _Ptr    0x01208dec {m_value=0 } Test *
+   _Rep    0x01208de0 make_shared  std::_Ref_count_base *

-   sp  shared_ptr {m_value=0 } [default] std::shared_ptr<Test>
+   _Ptr    0x01203c50 {m_value=0 } Test *
+   _Rep    0x01208d90 default  std::_Ref_count_base *
Run Code Online (Sandbox Code Playgroud)

似乎sp20x01208de0(有一个ref计数器)中分配,然后在0x01208dec中有一个Test对象.地点彼此非常接近.

在第二个版本中,我们有0x01208d90为参考计数器,0x01203c50的对象.那些地方相当遥远.

这是正确的输出吗?我能正确理解吗?

c++ memory-management smart-pointers

2
推荐指数
2
解决办法
374
查看次数

将std :: memcpy用于非平凡可复制类型的对象

标准定义我们可以通过以下方式使用std :: memcpy:

对于任何简单的可复制类型T,如果指向T的两个指针指向不同的T对象obj1和obj2,其中obj1和obj2都不是基类子对象,如果构成obj1的基础字节(1.7)被复制到obj2中,obj2将随后保持与obj1相同的值.

如果我们将该函数应用于非平凡可复制类型的对象,我们可能会遇到什么样的潜在问题?以下代码的工作原理就好像它适用于普通可复制类型:

#include <iostream>
#include <cstring>

using std::cout;
using std::endl;

struct X
{
    int a = 6;
    X(){ }
    X(const X&)
    {
        cout << "X()" << endl;
    }
};

X a;
X b;
int main()
{
    a.a = 10;
    std::memcpy(&b, &a, sizeof(X));
    cout << b.a << endl; //10
}
Run Code Online (Sandbox Code Playgroud)

DEMO

c++ types

2
推荐指数
2
解决办法
837
查看次数

Ada 中的新放置相当于什么?

我试图通过编写一组管理动态数组的过程来学习 Ada,但我不知道如何去做。在 C++ 中,我可以轻松地将任意对象放入内存中,如下所示:

#include <new>
#include <iostream>

class object {
  private:
    int value;

  public:
    ~object() noexcept { std::cout << "<> "; }
    object(int value) noexcept : value(value) { std::cout << object::value << ' '; }
};

constexpr auto size = 16;

int main() {
    auto buffer = static_cast<object*>(::operator new(size * sizeof(object)));
    for (auto offset = 0; offset < size; offset++)
        new (buffer + offset) object(offset);
    for (auto offset = 0; offset < size; offset++)
        (buffer + offset)->~object();
    ::operator delete(buffer); …
Run Code Online (Sandbox Code Playgroud)

c++ memory-management ada

2
推荐指数
1
解决办法
283
查看次数

接受新对象的宏

在我的代码中,我有:

#define EV( event ) SendEvent( new event );
EV( evFormat );
Run Code Online (Sandbox Code Playgroud)

但我想在EV宏中传递一个创建的对象,如:

CEvent *ev = new CEvent();
EV( ev );
Run Code Online (Sandbox Code Playgroud)

这可能吗?因为我无法修改EV宏.

c++ winapi mfc event-handling c-preprocessor

1
推荐指数
1
解决办法
984
查看次数

我可以用新的内存分配一块内存吗?

所以考虑到这个结构:

typedef struct {
    int* arr1;
    int* arr2;
} myStruct;
Run Code Online (Sandbox Code Playgroud)

这个答案描述了使用单个malloc来同时分配a myStruct和它的数组:

myStruct* p = malloc(sizeof(*p) + 10 * sizeof(*p->arr1) + 10 * num * sizeof(*p->arr2);

if(p != NULL) {
    p->arr1 = (int*)(p + 1);
    p->arr2 = p->arr1 + 10;
}
Run Code Online (Sandbox Code Playgroud)

我想知道有没有类似的方法来做到这一点new
显然,我希望能够分配到我在运行时收到的大小,就像使用C示例一样.

c c++ malloc new-operator dynamic-memory-allocation

1
推荐指数
1
解决办法
386
查看次数

在内存中组织c ++程序 - 堆栈和堆

我正在学习c ++,并想知道这样的程序是如何组织在主存储器中的.我知道有一个堆栈(带有堆栈框架)和一个堆.我知道动态分配的东西会在堆上分配它.这是由像malloc或的运营商完成的new.但我不能在这个小型的c ++程序中看到它们.

该程序由一个主类和一个名为的类组成MyClass.这堂课有:

  • 一个构造函数
  • 一个成员变量(int)
  • 一个成员函数

main类定义了一个Myclass对象,并定义了一个指向该对象的指针.

那么 - 这一切如何在记忆中组织起来?

#include <iostream>
using namespace std;

class MyClass {
    int i;
public:
    MyClass(int n) {
        i = n;
    }
    int get_nmbr() {
        return this->i;
    }
};


int main() {
    MyClass myClass(100), *p;
    cout << myClass.get_nmbr() << endl;
    p = &myClass;
    cout << p;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ memory heap stack

1
推荐指数
1
解决办法
2403
查看次数