标签: nullptr

使用nullptr计算指针偏移是否安全?

假设我有两个指针:

char* p1 = nullptr;
char* p2 = std::malloc( 4 );
std::size_t offset = p2 - p1;
Run Code Online (Sandbox Code Playgroud)

以这种方式获得抵消是否安全?到目前为止它在我的电脑上工作正常.但我想知道偏移是否可以超过size_t的最大数量,以致此方法失败?

c++ memory nullptr c++11

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

在 C++ 中将 NULL 转换为 SomeType* 有什么用?

我目前正在研究一些看起来很奇怪的第三方 C++ 代码(我从 C++11 开始)。让我感到困惑的许多事情之一是static_castfromNULL到某种指针类型的许多实例:

SomeClass* someClassPtr = static_cast<SomeClass*>(NULL);
Run Code Online (Sandbox Code Playgroud)

我知道你可以将指针从基类指针转换为派生类指针,但这里绝对没有继承。据我所知,这应该足够了:

SomeClass* someClassPtr = NULL;
Run Code Online (Sandbox Code Playgroud)

但是这段代码中唯一NULL没有被强制转换为特定指针类型的情况是向量和其他容器中的指针:

SomeOtherClass.vecOfSomeClassPtr[i] = NULL;
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

  • 这只是以前的旧式(甚至 C 式)代码nullptr吗?
  • NULL在处理继承时,除了向下/向上转换之外,其他事情是否需要强制转换?
  • 还是我完全错过了什么?

如果到目前为止我还没有弄错:
我首先替换了static_cast<type*>(NULL)withNULL和后来的所有实例nullptr,看看这是否会破坏任何东西:不。编译器没有抗议,程序似乎仍然按预期工作。但我知道指针可能是棘手的小混蛋,所以:

  • nullptr我可能错过了使用的哪些陷阱?

PS:是的,我确实使用了搜索,是的,我确实在 C 代码上找到了类似的问题。但这是 C++ 代码,我想确定地知道,而不仅仅是假设某些东西。

null pointers static-cast nullptr c++11

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

std::rethrow_exception(nullptr) 未定义行为还是 bad_exception?

我有一个代码片段,我用 nullptr 作为参数调用 rethrow_exception。文档说参数应该是非空的,但我想知道,如果我通过 nullptr,行为是未定义的还是已知的?

我每次都变得 bad_exception。但是,此链接表示该行为未定义。

std::string msg;
    try
    {
        std::rethrow_exception(nullptr);
    }
    catch (std::bad_exception &ex)
    {
        msg = ex.what();
    }
    catch (std::exception &ex)
    {
        msg = ex.what();
    }
    catch (...)
    {
        msg = "uncaught exception!";
    }
Run Code Online (Sandbox Code Playgroud)

任何人,谁能评论到底发生了什么?

c++ exception nullptr language-lawyer rethrow

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

C++ 编译器提示“自动返回类型推导不一致”

C++ 中有一个很好的功能,您可以说该函数的返回类型为“auto”,编译器会计算出它。但是,如果我在错误时返回指针和 nullptr 该怎么办?不知何故,编译器无法推断出正确的类型并给出错误。

在下面的简单示例中,imaginestd::vector<int>计划在将来完全被其他东西取代,以证明此处使用 auto 的合理性:

#include<vector>
std::vector<int> e;
auto test(){
  if(!e.empty())
    return &e[0];
  return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

在 c++17 中,我收到上述错误消息。

所以我尝试将最后一次返回替换为

return reinterpret_cast<decltype(&e[0])>(nullptr)

并得到错误invalid cast。我看到的唯一解决方案是将返回值替换为 3 行:

auto out=&e[0];
out=nullptr;
return out;
Run Code Online (Sandbox Code Playgroud)

我可能可以通过替换auto为某种 来将其减少到 2 行decltype,但我想其他类型的转换可以在一行中完成我想要的事情?或者我是否需要针对这种情况使用更新版本的 C++ 标准?

我还尝试了 std::make_Optional 并遇到了同样的问题,因为 nullopt_t 的类型与 std::Optional 不同。我真正喜欢的是,如果编译器能够自动推断类型无论如何std::optional......

c++ nullptr reinterpret-cast auto stdoptional

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

这种nullptr的使用是否会产生编译错误?

有没有一个很好的理由为什么这个代码在没有警告的情况下编译(并在运行时崩溃)与Visual C++ 2010:

int a = *((int*)nullptr);
Run Code Online (Sandbox Code Playgroud)

静态分析应该得出结论它会崩溃,对吧?

c++ visual-c++ nullptr c++11

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

如何将nullptr作为参数传递?

void Foo::Bar(Baz& x)
{
z = &x;
}

Foo* foo;

foo -> Bar(nullptr);
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用typedef创建一个通用模板Baz.由于z是私有的并且属于Foo,因此我无法将nullptr分配给z.

如果可能的话,我想在不改变太多实现的情况下将z设置为nullptr的最佳方法 - 除非这是一个实现的坏处.

我在想也许吧

(Baz*)0,或*(void*)0或可空类.

c++ nullptr

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

如何在C++ 11中终止以null结尾的字符串?

也许它是愚蠢的或明显的,但我不能谷歌任何答案.什么字符结束以空字符结尾的字符串C++11NULL(事实上0)或新的nullptr?一方面,nullptr应该取代NULL.但另一方面,我不确定它是否nullptr是一个角色.或者可以解释为一个.

null-terminated nullptr c++11

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

读取访问冲突_首先是nullPtr

我有一个默认构造函数,复制构造函数,析构函数,赋值 运算符,长度字符串函数.当我调用复制构造函数并尝试打印新char*的值时,我得到一个读取访问冲突_First是nullptr.调试器显示iosfwd代码并在错误处中断,但我不知道这意味着什么.任何帮助都是极好的.这是调试器显示错误的地方.

  static size_t __CLRCALL_OR_CDECL length(const _Elem *_First)
        {   // find length of null-terminated string
        return (*_First == 0 ? 0 // <- this line
            : _CSTD strlen(_First));
        }
Run Code Online (Sandbox Code Playgroud)

这些是我的功能(也不是我们不允许使用STRCPY)

 MyString::MyString() { //default constructor
    string = new char[6];
    int i = 0;
    for (i; i < strlen(string); i++) {
        string[i] = NULL;
    }
    string[i] = '\0';
}

    MyString::MyString(const MyString &s) { //copy constructor
    char* string = new char[strlen(s.string) …
Run Code Online (Sandbox Code Playgroud)

c++ nullptr

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

在调用析构函数时,是否可以将指向类实例的指针设置为nullptr?

我正在尝试为类项目创建链接列表.我的节点类有一个指向链接节点的指针和另一个指向专用书类的指针.

class Node{
private:
    Book *data;
    Node *linkedLink;
public:
    Node(Book *inputedData);
    Book* getBook();
    Node* getLinked();
    void changeLinked(Node *newLink);
    Node& operator=( const Node& rhs );

    ~Node(); //deconstructor
};
Run Code Online (Sandbox Code Playgroud)

我的教授提供了一个我们无法改变的驱动因素.在这个驱动程序中,他有以下代码:

// (bookList is an instance of my LinkedList class)
// (and getFirst() returns my LinkedList's head node)

while (bookList.getFirst() != nullptr)
{
    Node * t = partsList.pop_front();
    delete t;
}
Run Code Online (Sandbox Code Playgroud)

以下是我的节点类析构函数:

Node::~Node(){
    delete data; //this deletes the book class that data points to.
    delete linkedLink;
}
Run Code Online (Sandbox Code Playgroud)

问题是,我需要的变量(T)指向节点类的实例设置为nullptr它做释放后*data …

c++ pointers memory-management linked-list nullptr

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

查找指针为NULL

我有int* foo[SIZE],我想搜索它指向的第一个元素NULL.

但是当我这样做时:

 std::find(foo, foo + SIZE, NULL)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

错误C2446:'==':没有从'const int'转换为'int*'

我应该只使用static_cast<int*>(NULL)而不是NULL

C++ 11解决了这个问题,nullptr但在C++ 03中我不是一个选择

c++ null casting nullptr c++03

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