算术后删除一个指针

时间:2016-01-20 07:31:39

标签: c++

int main() {
  int* i = new int(1);
  i++;
  *i=1;
  delete i;
}

这是我的逻辑:

我将I递增1,然后为其赋值。然后我删除了我,所以我在泄漏原始内存时释放内存位置。我的问题在哪里?

我也尝试了不同的版本。每次,只要我做算术并删除指针,我的程序就会崩溃。

5 个答案:

答案 0 :(得分:3)

您的程序显示的是几种未定义行为的情况:

  1. 您写入尚未分配的内存(*i = 1
  2. 您可以免费分配您未分配的内容delete i + 1
  3. 你必须在与delete完全相同的指针值上调用new - 没有别的。假设您的其余代码有效,则可以在int *j = i;之后int *i = new int(1);进行delete j;,然后int *i = new int[2];。 [例如,i++; *i=1;会使您的<<:--!!\d{6}有效代码

答案 1 :(得分:1)

谁分配是谁解除分配。所以你不应该自己删除你不是新的东西。此外,i++;*i=1;是UB,因为您可以访问受限制的内存区域或只读内存...

代码毫无意义。我想你有XY问题。如果您可以发布原始问题,那么将有更多机会帮助您。

答案 2 :(得分:0)

在这种情况下,您需要简要了解堆内存管理的工作原理。特别是它的实现,当你分配一个对象时,你会收到一个指向你可以使用的内存开头的指针。然而,'真正'分配的内存开始有点'早'。这意味着分配的块比您请求分配的块多一点。块的开头是您收到的地址减去一些偏移量。因此,当您将递增的指针传递给delete时,它会尝试在其左侧找到内部信息。而且由于您的地址现在已递增,因此搜索失败会导致崩溃。简而言之。

答案 3 :(得分:0)

让我们一步一步来看:

int* i = new int(1);  // 1. Allocate a memory.
i++;                  // 2. Increment a pointer. The pointer now points to
                      //    another location.
*i=1;                 // 3. Dereference a pointer which points to unknown
                      //    memory. This could cause segmentation fault.
delete i;             // 4. Delete the unknown memory which is undefined 
                      //    behavior.

简而言之:如果你没有一块记忆,就不能用它算术,也不能删除它!

答案 4 :(得分:0)

问题在于:

ServerRoot "/opt/APACHE/httpd"

Listen 80

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/xxxx"
    ServerName front1.httpd.example.com
    ServerAlias front1.httpd.example.com
    ErrorLog "logs/dummy-host1.example.com-error_log"

    <Directory "/opt/APACHE/httpd/htdocs/xxxx">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/opt/APACHE/httpd/htdocs/yyyy"
    ServerName front2.httpd.example.com
    ServerAlias front2.httpd.example.com
    ErrorLog "logs/dummy-host2.example.com-error_log"
    <Directory "/opt/APACHE/httpd/htdocs/yyyy">
      Options Indexes FollowSymLinks
      AllowOverride all
      Require all granted
    </Directory>
</VirtualHost>

LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so

<IfModule unixd_module>
User ubuntu
Group ubuntu
</IfModule>

<Directory />
    AllowOverride none
    Require all denied
</Directory>

<IfModule dir_module>
    DirectoryIndex index.html
</IfModule>

<Files ".ht*">
    Require all denied
</Files>

ErrorLog "logs/error_log"

LogLevel warn

<IfModule log_config_module>
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common

    <IfModule logio_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
    </IfModule>

    CustomLog "logs/access_log" common

</IfModule>

<IfModule alias_module>
    ScriptAlias /cgi-bin/ "/opt/APACHE/httpd/cgi-bin/"
</IfModule>

<IfModule cgid_module>
</IfModule>

<Directory "/opt/APACHE/httpd/cgi-bin">
    AllowOverride None
    Options None
    Require all granted
</Directory>

<IfModule mime_module>
    TypesConfig conf/mime.types

    AddType application/x-compress .Z
    AddType application/x-gzip .gz .tgz
</IfModule>

<IfModule proxy_html_module>
Include conf/extra/proxy-html.conf
</IfModule>

<IfModule ssl_module>
SSLRandomSeed startup builtin
SSLRandomSeed connect builtin
</IfModule> 

此行不会增加值 i++; 指向的值,但指针本身会增加i所具有的字节数(32位平台上的4)。 你打算这样做:

int