相关疑难解决方法(0)

在C函数中创建的对象的存在

已经建立(见下文)new创建对象需要放置

int* p = (int*)malloc(sizeof(int));
*p = 42;  // illegal, there isn't an int
Run Code Online (Sandbox Code Playgroud)

然而,这是在C中创建对象的一种非常标准的方式.

问题是,int如果是在C中创建并返回到C++ ,是否存在?

换句话说,以下是否保证合法?假设intC和C++是相同的.

foo.h中

#ifdef __cplusplus
extern "C" {
#endif

int* foo(void);

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

foo.c的

#include "foo.h"
#include <stdlib.h>

int* foo(void) {
    return malloc(sizeof(int));
}
Run Code Online (Sandbox Code Playgroud)

main.cpp中

#include "foo.h"
#include<cstdlib>

int main() {
    int* p = foo();
    *p = 42;
    std::free(p);
}
Run Code Online (Sandbox Code Playgroud)

有关安置强制性质的讨论的链接new:

c c++ object-lifetime language-lawyer

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

绕过一个类的构造函数是合法的还是会导致未定义的行为?

请考虑以下示例代码:

class C
{
public:
    int* x;
};

void f()
{
    C* c = static_cast<C*>(malloc(sizeof(C)));
    c->x = nullptr; // <-- here
}
Run Code Online (Sandbox Code Playgroud)

如果由于任何原因我不得不忍受未初始化的内存(当然,如果可能的话,我会打电话new C()),我仍然可以调用放置构造函数.但是,如果我省略这一点,如上所述,并手动初始化每个成员变量,是否会导致未定义的行为?即绕过构造函数本身未定义的行为,或者用类外的一些等效代码替换调用它是否合法?

(通过另一个完全不同的问题遇到这个问题;要求好奇......)

c++ malloc object-lifetime language-lawyer

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

用memcpy"构造"一个​​可复制的对象

在C++中,这段代码是否正确?

#include <cstdlib>
#include <cstring>

struct T   // trivially copyable type
{
    int x, y;
};

int main()
{
    void *buf = std::malloc( sizeof(T) );
    if ( !buf ) return 0;

    T a{};
    std::memcpy(buf, &a, sizeof a);
    T *b = static_cast<T *>(buf);

    b->x = b->y;

    free(buf);
}
Run Code Online (Sandbox Code Playgroud)

换句话说,是*b一个生命已经开始的对象?(如果是的话,它什么时候开始呢?)

c++ lifetime language-lawyer

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

标签 统计

c++ ×3

language-lawyer ×3

object-lifetime ×2

c ×1

lifetime ×1

malloc ×1