как placement new пишется?
От: Аноним  
Дата: 28.05.14 09:03
Оценка: -1 :)
class CS
{   public:
    char *data;
    CS()
    {

    };
};

int main(int argc, char *argv[])
{
    void *z;
    CS *x=new(z)  CS();
    return 0;
}



выдает

||=== Build: Debug in 1 (compiler: GNU GCC Compiler) ===|

XZ.cpp|18|error: no matching function for call to 'operator new(sizetype, void*&)'|
XZ.cpp|18|note: candidate is:|
:0|0|note: void* operator new(unsigned int)|
:0|0|note: candidate expects 1 argument, 2 provided|
XZ.cpp|18|warning: unused variable 'x' [-Wunused-variable]|
||=== Build failed: 1 error(s), 1 warning(s) (0 minute(s), 0 second(s)) ===|


во всех примерах так пишется — может заголовок какой нужно?

мене еще нужны
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
— но они никак не влияют.
Re: как placement new пишется?
От: Jack128  
Дата: 28.05.14 09:20
Оценка:
Здравствуйте, Аноним, Вы писали:


#include <memory> ?
Re: как placement new пишется?
От: andyp  
Дата: 28.05.14 09:36
Оценка:
#include <new> ???
Re: как placement new пишется?
От: Кодт Россия  
Дата: 28.05.14 09:47
Оценка:
Здравствуйте, Аноним, Вы писали:


А>
А>    void *z;
А>    CS *x=new(z)  CS();
А>


Хорошо, что не скомпилировалось из-за отсутствия #include <memory>
Если бы скомпилировалось, оно бы взяло значение неинициализированного указателя z и расстреляло бы память по этому адресу.
Надо так
char here[sizeof(CS)]; // лучше взять boost::aligned_storage<sizeof(CS)>
void* there = malloc(sizeof(CS)); // или MS-specific - aligned_malloc(sizeof(CS),__alignof(CS))

CS* x = new(here) CS();
CS* y = new(there) CS();

x->~CS();
y->~CS();

free(there);
Перекуём баги на фичи!
Re[2]: как placement new пишется?
От: uzhas Ниоткуда  
Дата: 28.05.14 11:02
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Хорошо, что не скомпилировалось из-за отсутствия #include <memory>

К>Если бы скомпилировалось, оно бы взяло значение неинициализированного указателя z и расстреляло бы память по этому адресу.

ну конкретно в этом случае расстрела не будет, ибо в память никто не пишет
Re[3]: как placement new пишется?
От: Vain Россия google.ru
Дата: 29.05.14 05:44
Оценка:
Здравствуйте, uzhas, Вы писали:

К>>Хорошо, что не скомпилировалось из-за отсутствия #include <memory>

К>>Если бы скомпилировалось, оно бы взяло значение неинициализированного указателя z и расстреляло бы память по этому адресу.
U>ну конкретно в этом случае расстрела не будет, ибо в память никто не пишет
в дебаге неинициализированные переменные будут заполнены спец значениями
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: как placement new пишется?
От: Honduras  
Дата: 29.05.14 06:35
Оценка:
Здравствуйте, Jack128, Вы писали:

J>Здравствуйте, Аноним, Вы писали:



J>#include <memory> ?


#include <memory> — лечит спсб! Именно он не <new> . Вообще вроде как встроенная вещь, так вдруг может и #include <continue> для continue понадобиться


взяли пример http://www.sourcetricks.com/2008/05/c-placement-new.html и к общему привел — CS ошибка ( без <memory> ), MyClass проходит — одни и теж коды
//#include <memory>
class CS
{   public:
    char *data;
    /*
    CS()
    {

    };
    */
};

int main0000(int argc, char *argv[])
{
   // void *z;
    int z[16];
    CS *x=new(z)  CS();   // ТОЛЬКО ЗДЕСЬ ОШИБКА
    return 0;
}


#include <iostream>
using namespace std;

class MyClass {

   public:

    // Placement new operator
    /*
    void* operator new (size_t sz, void* v) {
        cout << "Placement new invoked" << endl;
        return v;
    }
     */
    ~MyClass() {
        // Cleanup
    }
};

int main()
{
    // Create a buffer to store the object
    int buffer[16];
    cout << "Starting address of my buffer = " << &buffer << endl;

    // Create the object. Use placement new
    MyClass* obj = new (buffer) MyClass();
    cout << "Location of my object = " << obj << endl;

    // Don't delete object created with placement delete
    // Call the destructor explicitly
    obj->~MyClass();
}
Здесь http://www.cplusplus.com/reference/new/operator%20new/ new описан как глобальный ( не член класса ), тоже с 2-мя параметрами, который компилятор предлагает, значит видит?
new
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.