相关疑难解决方法(0)

我不认为这是铸造,但它是什么?

这包含在for循环中:

v[i] = new (&vv[i]) vertex(pts[i],i);
Run Code Online (Sandbox Code Playgroud)
  • vertex 是一个 struct
  • pts 是一个 point*
  • v 是一个 vertex**
  • vv 是一个 vertex*

(&vv[i])部分做什么?

c++ struct

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

使用malloc()初始化类

当从C malloc保留内存时,应该如何使用c ++类?

我正在使用一个C库(lua),我需要向它公开一个C++类,在这种情况下,为了垃圾收集这些保留空间,lua进行内存预留.

下面是一个更简单的类似场景:

#include <string>

class Clase{
private:
    std::string valor;
public:
    Clase(){}
    Clase(const std::string & valor) : valor(valor){}
    const std::string & get() const { return this->valor; }
    void set(const std::string & valor){ this->valor = valor;}
    ~Clase(){}
};

typedef struct
{
    Clase cls;
}Estructura;

int main(int argc, char ** argv)
{
    Estructura * est = (Estructura *) malloc(sizeof(Estructura));

    est->cls.set("Hola");   // First attempt

    Clase myCls;   // Second attempt
    est->cls = myCls;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我理解并检查过,使用malloc不会调用类构造函数; 这是预期的,因此无法使用无效实例(Class中的字符串)调用copy(assign)运算符.我怀疑在Class实例中复制字符串时,第二次尝试在同一点失败.

所以:

  • 是否可以正确初始化由malloc保留其内存的类实例?
  • 什么其他警告?,vtables?
  • 对malloc的免费补充会留下内存泄漏吗?(我猜测由于Clase析构函数不会被调用,字符串将无法正确释放?[我假设该字符串在实例本身之外保存内存]) …

c c++ malloc lua new-operator

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

我是否需要删除使用new和placement构造的对象

class Foo{
//some member
    public:
    int bar;
}

int main(){
    char* buffer = new char[100];
    Foo* f = new(buffer)Foo();
//do i have to
    delete f;
//or is 
    delete[] buffer;
//enough
}
Run Code Online (Sandbox Code Playgroud)

当然,我必须删除它,如果删除对系统Foo有一些重大影响,但让我们说它是一个简单的存储对象,我放置在缓冲区内,并没有解构,删除其他一些东西.

  • 我是否必须删除一个对象,该对象在缓冲区内部具有新位置或者是否足以删除缓冲区?
  • 如果我必须在缓冲区内的每个对象上调用delete,为什么我要这个?

我读到了:他说的是什么用途 - 用于放置新品

您不应该释放使用内存缓冲区的每个对象.相反,您应该只删除[]原始缓冲区.

c++ memory memory-management new-operator placement

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

如何让对象在内存中的特定位置构建自己?

可能重复:
在特定的内存地址创建新的C++对象?

我正在编写本质上是一个对象池分配器,它将分配一个类.我正在分配足够的内存来适应我需要的对象,我正在传递指向内部空间的指针.

现在我的问题是这样的:一旦我在我的池中得到一个指针,我该如何在那里构建一个对象?

c++ stl allocator

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

C++:将类实例存储在已分配的内存中

我上课了A.我正在使用的一些库为我分配给定量的内存,sizeof A,并返回一个指向它的void指针.

A* pObj = (A*) some_allocator_im_forced_to_use( sizeof A );
Run Code Online (Sandbox Code Playgroud)

现在我如何A在刚刚分配的内存中创建一个新实例?

我尝试过:

*pObj = A();
Run Code Online (Sandbox Code Playgroud)

但这不起作用 - 析构函数在A的构造函数之后被调用.

c++ malloc pointers

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

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++删除,但不仅仅是类型

假设我只想分配256字节的内存块

char * memory = new char[256];
Run Code Online (Sandbox Code Playgroud)

比我使用placement new来创建一个FooBar对象(sizeof(Foobar)<= 256)

FooBar * obj = new (memory) FooBar();
Run Code Online (Sandbox Code Playgroud)

delete obj; //this also calls the destructor of FooBar
Run Code Online (Sandbox Code Playgroud)

删除所有256字节的内存?

标准是否保证仅通过"删除obj"来释放整个"内存"缓冲区?或者它基于类型"FooBar",因此此操作具有未定义的行为?

假设:FooBar是内存缓冲区中唯一的对象.

这不是重复的问题,请先了解问题.这个代码的作用并不是很明显.

c++ allocation placement-new delete-operator

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

这是什么语法 - new(this)T();

我遇到了这样的C++代码:

T& T::operator=(const T&t) 
{
   ...
   new (this) T(t);
   ...
}
Run Code Online (Sandbox Code Playgroud)

这条线对我来说太陌生了:new (this) T(t);

我可以看到它正在调用复制构造函数来填充"this",但不知怎的,我只是无法理解语法.猜猜我已经习惯了this = new T(t);

你能救我吗?

c++

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

new(float*)[]和new float*[]之间的区别

有什么区别:new int*[]new (int*)[]:

int** pA = new int*[2] // returns a pointer to an array of pointers to int.

new (int*)[2] // what should this return ? Shouldn't it be same as the above. 
Run Code Online (Sandbox Code Playgroud)

同样,

float* pB1 = new float[3]; // compiles successfully.

float* pB2 = new (float)[3] //Gives an error. Shouln't it return an array of floats ?
Run Code Online (Sandbox Code Playgroud)

但是,编译器说:

A value of type 'float' cannot be used to initialize a value of type float* . …
Run Code Online (Sandbox Code Playgroud)

c++ arrays pointers

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

如果不使用堆,移动语义有用吗?

我对移动语义的直觉是对象字段的浅层复制,然后可能是对旧 r 值的一些破坏。然而,据我所知,当某些字段拥有指针/引用时,只有浅拷贝/深拷贝存在差异。如果您根本不使用堆,所以没有mallocor new,那么您可能不会有拥有指针的类/结构。因此,移动构造函数与常规复制构造函数没有任何区别。我的逻辑正确吗?

c++ move heap-memory move-semantics

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