我可以 return C++ 方法中的 NULL 指针吗?
Can I return a NULL-Pointer in a C++ method?
在我的代码中,我使用了一个方法 getNumberOfP_ForAdd()
。此方法打开一个文件和 returns 一个 XMLDocumentWrapper*。
XMLDocumentWrapper* Tab::getNumberOfP_ForAdd()
{
QString defaultName = GuiUtil::getLastPath();
QString fileName = QFileDialog::getOpenFileName(this, "Open " + displayName + " File",
defaultName, displayName + " Files (*." + fileSuffix + ")", 0, 0);
if (fileName.isNull() || fileName.isEmpty()) {
qDebug() << "Load" << displayName << "aborted.";
return NULL;
}
GuiUtil::setLastPath(fileName);
// Open file
XMLDocumentWrapper* inputDoc = XMLDocumentWrapper::readFromFile(fileName);
if (inputDoc == NULL) {
qDebug() << "Load" << displayName << "aborted.";
return NULL ;
}
return inputDoc;
}
当我尝试读取文件时,我首先检查两件事:天气
(fileName.isNull() || fileName.isEmpty())
和
(inputDoc == NULL)
如果这些陈述属实,我会
return NULL;
我可以简单地 return 一个 NULL-Ptr 还是我 运行 这样做会遇到问题?
我必须再次释放该指针吗?
Can I simply return a NULL-Ptr?
是
Would I run into problems in doing so?
只有当您尝试调用该指针上的方法时,才会出现未定义行为。
Do I have to free that pointer again?
不,在 NULL
指针上使用 delete
或 free
是有效但不必要的。
你可以return一个NULL
指针。
Do I have to free that pointer again?
delete
仅当您在免费商店分配 space 时才需要。
但是,如果您使用 C++11 或更高版本,我建议使用 nullptr
而不是 NULL
。在这个特定的代码中,它没有提供显着的改进,但我认为它是一种很好的风格,也划清了 C 和 C++ 之间的界限。
如果函数的 return 类型是指针,则可以 return 空指针。
如果调用者检查 return 值并处理 return 值为 null 的情况 - 那么应该没有任何问题。如果调用者试图取消引用此指针,则会出现问题。
函数 return 是一个指针这一事实并不一定意味着开发人员需要释放内存。指针可以指向任何东西,包括堆栈和全局变量。开发人员应该查看函数的文档以确定如何处理 return 值。无论如何,删除空指针没有问题,但同样,应该首先查看 she/he 是否需要释放某些东西。
我认为您的问题大体上已得到解答,但是...请注意。
我对 XMLDocumentWrapper class 一无所知。另一方面,我希望调用者必须清理(删除)这个返回的指针。
在我的代码中,我使用了一个方法 getNumberOfP_ForAdd()
。此方法打开一个文件和 returns 一个 XMLDocumentWrapper*。
XMLDocumentWrapper* Tab::getNumberOfP_ForAdd()
{
QString defaultName = GuiUtil::getLastPath();
QString fileName = QFileDialog::getOpenFileName(this, "Open " + displayName + " File",
defaultName, displayName + " Files (*." + fileSuffix + ")", 0, 0);
if (fileName.isNull() || fileName.isEmpty()) {
qDebug() << "Load" << displayName << "aborted.";
return NULL;
}
GuiUtil::setLastPath(fileName);
// Open file
XMLDocumentWrapper* inputDoc = XMLDocumentWrapper::readFromFile(fileName);
if (inputDoc == NULL) {
qDebug() << "Load" << displayName << "aborted.";
return NULL ;
}
return inputDoc;
}
当我尝试读取文件时,我首先检查两件事:天气
(fileName.isNull() || fileName.isEmpty())
和
(inputDoc == NULL)
如果这些陈述属实,我会
return NULL;
我可以简单地 return 一个 NULL-Ptr 还是我 运行 这样做会遇到问题? 我必须再次释放该指针吗?
Can I simply return a NULL-Ptr?
是
Would I run into problems in doing so?
只有当您尝试调用该指针上的方法时,才会出现未定义行为。
Do I have to free that pointer again?
不,在 NULL
指针上使用 delete
或 free
是有效但不必要的。
你可以return一个NULL
指针。
Do I have to free that pointer again?
delete
仅当您在免费商店分配 space 时才需要。
但是,如果您使用 C++11 或更高版本,我建议使用 nullptr
而不是 NULL
。在这个特定的代码中,它没有提供显着的改进,但我认为它是一种很好的风格,也划清了 C 和 C++ 之间的界限。
如果函数的 return 类型是指针,则可以 return 空指针。
如果调用者检查 return 值并处理 return 值为 null 的情况 - 那么应该没有任何问题。如果调用者试图取消引用此指针,则会出现问题。
函数 return 是一个指针这一事实并不一定意味着开发人员需要释放内存。指针可以指向任何东西,包括堆栈和全局变量。开发人员应该查看函数的文档以确定如何处理 return 值。无论如何,删除空指针没有问题,但同样,应该首先查看 she/he 是否需要释放某些东西。
我认为您的问题大体上已得到解答,但是...请注意。 我对 XMLDocumentWrapper class 一无所知。另一方面,我希望调用者必须清理(删除)这个返回的指针。