这包含在for循环中:
v[i] = new (&vv[i]) vertex(pts[i],i);
Run Code Online (Sandbox Code Playgroud)
vertex 是一个 structpts 是一个 point*v 是一个 vertex**vv 是一个 vertex*这(&vv[i])部分做什么?
当从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实例中复制字符串时,第二次尝试在同一点失败.
所以:
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有一些重大影响,但让我们说它是一个简单的存储对象,我放置在缓冲区内,并没有解构,删除其他一些东西.
我读到了:他说的是什么用途 - 用于放置新品
您不应该释放使用内存缓冲区的每个对象.相反,您应该只删除[]原始缓冲区.
可能重复:
在特定的内存地址创建新的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的构造函数之后被调用.
最近,我遇到了对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确认没有内存泄漏。
有人可以阐明“新”运算符的用法吗?
假设我只想分配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++代码:
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);
你能救我吗?
有什么区别: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)
但是,编译器说:
Run Code Online (Sandbox Code Playgroud)A value of type 'float' cannot be used to initialize a value of type float* . …
我对移动语义的直觉是对象字段的浅层复制,然后可能是对旧 r 值的一些破坏。然而,据我所知,当某些字段拥有指针/引用时,只有浅拷贝/深拷贝存在差异。如果您根本不使用堆,所以没有mallocor new,那么您可能不会有拥有指针的类/结构。因此,移动构造函数与常规复制构造函数没有任何区别。我的逻辑正确吗?
c++ ×10
new-operator ×3
malloc ×2
pointers ×2
allocation ×1
allocator ×1
arrays ×1
c ×1
heap-memory ×1
lua ×1
memory ×1
move ×1
placement ×1
stl ×1
struct ×1