牛虻是什么| 胸腰椎退行性变是什么意思| 画眉鸟吃什么| 冬天开什么花| 绒毛膜促性腺激素是什么意思| 腋下疼痛是什么原因| 怀孕一个月有点见红是什么情况| 肾腺瘤是什么病严重吗| 圣诞是什么意思| ehe是什么牌子| 有什么症状是肯定没怀孕| 左卡尼汀口服溶液主要治疗什么| 休克是什么| 血脂高有什么症状| 观音坐莲是什么意思| 说话鼻音重是什么原因| 风热火眼是什么意思| 扁桃体肥大吃什么药好得快| 口什么心什么| 为什么会起鸡皮疙瘩| 氯高是什么原因| 肝喜欢什么食物有哪些| 协会是什么意思| 泄泻病是什么意思| 胃酸分泌过多是什么原因造成的| 六字箴言是什么意思| 眼睛睁不开是什么原因| 恶寒是什么意思| 水果什么时间段吃最好| 右手麻木是什么病| 经常感觉饿是什么原因| 野生葛根粉有什么功效| 吃什么东西能变白| 食欲不振是什么原因| 花中皇后指的是什么花| 爱的最高境界是什么| 什么是手机号| 孩子专注力差去什么医院检查| 怕热是什么原因| 藏在我回忆里的那个人什么歌| 事例是什么意思| 作死是什么意思| 没落是什么意思| 南瓜和窝瓜有什么区别| 高密度脂蛋白偏高是什么原因| 一什么波纹| 胆囊疼是什么原因| 查脂肪肝挂什么科室| 冰火两重天是什么意思| 总是打嗝是什么原因引起的| 棒子面是什么| 皮肤经常痒是什么原因| ng是什么单位| 癣是什么原因引起的| 金蟾吃什么| 骨髓炎是什么病| 龙凤胎是什么意思| 在屋顶唱着你的歌是什么歌| 3月30日是什么星座| 什么是沉没成本| 吃什么能让肠道蠕动快| hook是什么意思| 血友病是什么意思| 甲状腺是什么功能| 胃痛可以吃什么水果| 什么灯不会亮| 逍遥丸主要治什么病| 宝宝吃益生菌有什么好处和坏处| 梦见自己生个女孩是什么意思| 其实不然是什么意思| 变应原皮内试验是测什么的| 什么叫高潮| 六安瓜片是什么茶| 六月二十六是什么日子| 一什么新月| 2.4什么星座| 气血不足吃什么调理| 维生素B6有什么功效| 梦见到处都是蛇预示着什么| 什么牌子的燃气灶质量好| 膝盖后面的窝叫什么| 名侦探柯南什么时候完结| 24D是什么激素| 左什么结构| 年轮是什么意思| 什么是闭口| 一什么桃花| 是什么符号| 晋升是什么意思| 冰箱里有什么细菌| 提拔是什么意思| 什么是童话| 上师是什么意思| 月经前腰疼的厉害是什么原因| 意什么风发| maga是什么意思| 甘油三酯指的是什么| 包皮龟头炎吃什么药| 牙龈肿是什么原因引起的| 尿潜血十一是什么意思| 牙龈肿痛挂什么科| 手痛挂什么科| 广西狗肉节是什么时候| 葡萄糖氯化钠注射作用是什么| 后中长是什么意思| 大便拉不出来是什么原因| 推拿是什么| 笑点低是什么意思| 莲子吃了有什么好处| 脖子上长扁平疣是什么原因| 糖类抗原什么意思| 玫瑰糠疹是什么原因引起的| 15岁属什么| 服饰是什么意思| 空调睡眠模式什么意思| 充电宝什么品牌最好| 捉虫是什么意思| 蓝莓有什么好处| 91年属什么生肖| 五心烦热吃什么中成药| 清谈是什么意思| 属羊的什么命| 11月12日是什么星座| 属鸡女和什么属相最配| 皮肤过敏涂什么药膏| 球蛋白是什么意思| 感冒吃什么水果好| 下颌关节紊乱挂什么科| 血糖高吃什么降血糖| 霉菌是什么菌| 翘楚是什么意思| 三伏天吃什么| 烤冷面的面皮是什么面| 逆钟向转位什么意思| 痱子吃什么药| 6月4号是什么星座| 执业药师什么时候报名| 第一次世界大战是什么时候| 家属是什么意思| 来月经喝红糖水有什么好处| 小腿肚抽筋是什么原因| 小孩咳嗽不能吃什么食物| 一什么景象| 什么东西补气血效果最好| 南瓜为什么叫南瓜| 肾阳虚喝什么泡水最好| 肚脐眼位置疼是什么原因| 南冠指的是什么| 儿女双全是什么意思| 东北属于什么气候| 温度计里面红色液体是什么| 空调抽真空是什么意思| 李连杰为什么不娶丁岚| 胃胀不消化吃什么药| 氨酚咖那敏片是什么药| 石榴石是什么材质| 胆固醇高吃什么| 细菌性阴道病用什么药| 什么原因会引起胎停| 竹外桃花三两枝的下一句是什么| 喝酒手麻是什么原因| 正月二十是什么星座| 舌头溃疡吃什么水果| 中央候补委员是什么级别| 韩字五行属什么| 蚊子不咬什么血型的人| 酵素什么牌子好| columbia是什么牌子| 邪犯少阳证是什么意思| 女性脱发严重是什么原因引起的| 手脚抽筋吃什么药最好| 光是什么生肖| 梦见死人是什么征兆| pdrn是什么| 湿疹是什么样子| 宫颈管搔刮术是什么| 干什么挣钱快| 肠炎挂什么科| 胎儿右侧脉络丛囊肿是什么意思| 白细胞多是什么原因| 女人梦见狗是什么预兆| mri是什么检查项目| 眼睛痒用什么药| 感冒冒虚汗是什么原因| 一什么杯子| 女性胆囊炎有什么症状| 脾切除对身体有什么影响| 治飞蚊症用什么眼药水| 窦性心律过速是什么意思| 为什么回族不吃猪肉| 属猪的本命佛是什么佛| 体积是什么| 肠胃湿热吃什么药| 量贩式ktv是什么意思| elle是什么档次的牌子| 喝什么饮料对身体好| 手上长毛是什么原因| 脚踝后面的筋疼因为什么| 梦到自己怀孕是什么意思| 狐臭是什么| 1997年属什么生肖年| 肺气肿吃什么食物好| 肠胃不好吃什么水果| 做梦梦见掉牙齿是什么意思| 公公是什么意思| 梦见车丢了是什么征兆| 起床头疼是什么原因| 漏斗胸是什么原因造成的| 家里为什么会有蜈蚣| 母子健康手册有什么用| 桃花开在什么季节| 桃花劫是什么意思| 为什么肚子越来越大| 反酸吃什么药| 做梦梦到搬家什么意思| 雨淋棺材有什么说法| 声音嘶哑吃什么药| 生孩子需要准备什么东西| 暑湿是什么意思| 肺大泡有什么症状| 什么是物理| 心身医学科是看什么病| 线索是什么意思| 什么叫紫癜| 舌苔厚口臭吃什么药好| 重阳节是干什么的| 棉纶是什么面料| 阴唇痒用什么药| 身体游走性疼痛什么病| 手指上长毛是什么原因| 德字五行属什么| 身心健康是什么意思| 什么是行政拘留| w3是什么意思| from是什么意思| 东倒西歪的动物是什么生肖| 急性支气管炎吃什么药| 硒是什么意思| 甲状腺结节是什么引起的| 什么是尿毒症| 李连杰是什么国籍| 7月20是什么星座| 白细胞低吃什么好| 炎性肉芽肿是什么意思| 小孩子睡觉流口水是什么原因| 打九价是什么意思| 梦见自己化妆是什么意思| 双肾囊性灶是什么意思| graff是什么牌子| ve是什么意思| 米五行属什么| 狼吞虎咽的意思是什么| 什么是理科什么是文科| 容易长口腔溃疡是什么原因| 最毒的蛇是什么蛇| 体检挂什么科室| 无机磷偏低有什么影响| 肝内钙化斑是什么意思| 气色是什么意思| 脾胃气虚吃什么药| 吃什么利于排便| 跳脱是什么意思| 什么动物吃蛇| mts是什么意思| 百度

最佳的洗头时间和护理干货 90%的人都没听过

百度 再看车内的舒适、多媒体功能也非常全面,可以说奔驰E级低配车型已经能满足大多数消费者的基本使用需求。

In object-oriented programming, a destructor (sometimes abbreviated dtor[1]) is a method which is invoked mechanically just before the memory of the object is released.[2] It can happen either when its lifetime is bound to scope and the execution leaves the scope, when it is embedded in another object whose lifetime ends, or when it was allocated dynamically and is released explicitly. Its main purpose is to free the resources (memory allocations, open files or sockets, database connections, resource locks, etc.) which were acquired by the object during its life and/or deregister from other entities which may keep references to it. Destructors are necessary in resource acquisition is initialization (RAII).

With most kinds of automatic garbage collection algorithms, the releasing of memory may happen a long time after the object becomes unreachable, making destructors unsuitable for time-critical purposes. In these languages, the freeing of resources is done through an lexical construct (such as try-finally, Python's with, or Java's "try-with-resources"), or by explicitly calling a function (equivalent to explicit deletion); in particular, many object-oriented languages use the dispose pattern.

Syntax

edit
  • C++: destructors have the same name as the class with which they are associated, but with a tilde prefix (for example, a class X with a constructor X() has a destructor ~X()).[2]
  • C#: same syntax as C++. Historically called destructors, now called finalizers due to confusion.[3]
  • D: declared as ~this() (whereas constructors are declared as this()).
  • Java: provided by 2 interfaces, Closeable (deprecated) and AutoCloseable. In Java 9+, destructors are replaced by Cleaner. Java also used to have Object.finalize(), which was also deprecated.
  • Object Pascal: destructor methods have the keyword destructor and can be any name, but convention is Destroy.
  • Objective-C: destructor method is named dealloc.
  • Perl: destructor method is named DESTROY; in the Moose object system extension, it is named DEMOLISH.
  • PHP: In PHP 5+, destructor method is named __destruct. There were no destructors in prior versions of PHP.[4]
  • Python: destructor method is named __del__. Called destructors in Python 2,[5] now called finalizers in Python 3.[6]
  • Rust: destructor method is named drop and is provided by the Drop trait.[7]
  • Swift: destructor method is named deinit.

Language details

edit

The destructor has the same name as the class, but with a tilde (~) before it.[2] For example, a class called Foo will have the destructor ~Foo(). Additionally, destructors have neither parameters nor return types.[2] As stated above, a destructor for an object is called whenever the object's lifetime ends.[2] If the object was created as an automatic variable, its lifetime ends and the destructor is called automatically when the object goes out of scope. Because C++ does not have garbage collection, if the object was created with a new statement (dynamically on the heap), then its destructor is called when the delete operator is applied to a pointer to the object. Usually that operation occurs within another destructor, typically the destructor of a smart pointer object.

In inheritance hierarchies, the declaration of a virtual destructor in the base class ensures that the destructors of derived classes are invoked properly when an object is deleted through a pointer-to-base-class. Objects that may be deleted in this way need to inherit a virtual destructor.

A destructor should never throw an exception.[8]

Non-class scalar types have what's called a pseudo-destructor which can be accessed by using typedef or template arguments. This construct makes it possible to write code without having to know if a destructor exists for a given type.

int f() {
    int a = 123;
    using T = int;
    a.~T();
    return a; // undefined behavior
}

In older versions of the standard, pseudo-destructors were specified to have no effect, however that was changed in a defect report to make them end the lifetime of the object they are called on.[9]

Objects which cannot be safely copied and/or assigned should be disabled from such semantics by declaring their corresponding functions as deleted. A detailed description of this method can be found in Scott Meyers' popular book, Effective Modern C++ (Item 11: "Prefer deleted functions to private undefined ones."[10]). If they are marked deleted, they should be public so that accidental uses do not warn that they are private, but explicitly deleted. Since C++26, it is possible to specify a reason for the deletion.

Example

edit
import std;

class Foo {
private:
    char data[];
    friend struct std::formatter<Foo>;
public:
    // Constructor
    explicit Foo(const char* s = ""): 
        data{new char[std::strlen(s) + 1]} {
        std::strcpy(data, s);
    }

    Foo(const Foo& other) = delete("Copy construction disabled");
    Foo& operator=(const Foo& other) = delete("Copy assignment disabled");

    // Destructor
    ~Foo() { 
        delete[] data; 
    }
};

template <>
struct std::formatter<Foo> {
    constexpr auto parse(std::format_parse_context& ctx) -> const char* {
        return ctx.end();
    }

    template <typename FormatContext>
    auto format(const Foo& foo, FormatContext& ctx) -> FormatContext::iterator {
        return std::format_to(ctx.out(), "{}", foo.data);
    }
};

int main(int argc, char* argv[]) {
    Foo foo("Hello from the stack!");
    std::println("{}", foo);

    Foo* foo = new Foo("Hello from the heap!");
    std::println("{}", *foo);
    delete foo;
}

By using smart pointers with the "Resource Acquisition is Initialization" (RAII) idiom, manually defining destructors or calling resource cleanup can be bypassed. Other languages like Java and C# include a finally block for cleanup, however C++ does not have the finally block and instead encourages using the RAII idiom.

import std;

class Foo {
private:
    std::unique_ptr<char[]> data;
    friend struct std::formatter<Foo>;
public:
    // Constructor
    explicit Foo(const char* s = ""):
        data{std::make_unique<char[]>(std::strlen(s) + 1)} {
        std::strcpy(data.get(), s);
    }

    Foo(const Foo& other) = delete("Copy construction disabled");
    Foo& operator=(const Foo& other) = delete("Copy assignment disabled");

    // Destructor is automatically handled by unique_ptr
    ~Foo() = default;
};

template <>
struct std::formatter<Foo> {
    constexpr auto parse(std::format_parse_context& ctx) -> const char* {
        return ctx.end();
    }

    template <typename FormatContext>
    auto format(const Foo& foo, FormatContext& ctx) -> FormatContext::iterator {
        return std::format_to(ctx.out(), "{}", foo.data.get());
    }
};

int main(int argc, char* argv[]) {
    Foo foo("Hello from the stack!");
    std::println("{}", foo);

    std::unique_ptr<Foo> foo = std::make_unique<Foo>("Hello from the heap!");
    std::println("{}", *foo);
}

Destructors in C# are not manually called or called by a delete operator like in C++. They are only called by the garbage collector.

 
UML class in C# containing a constructor and a destructor.
using System;

class MyClass
{
    private string resource;

    public MyClass(string resourceName)
    {
        resource = resourceName;
    }

    ~MyClass()
    {
        Console.WriteLine($"Destructor called to clean up resource: {resource}");
        // cleanup code
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass obj = new MyClass("Sample Resource");
        
        GC.Collect();
        GC.WaitForPendingFinalizers();

        Console.WriteLine("Program finished");
    }
}

C# also has a "dispose" pattern in which the class must implement the interface IDisposable. C# supports try-with-resources blocks similar to Java, called using-with-resources. A class must implement IDisposable to be used in a using-with-resources block.

using System;

class MyClass : IDisposable
{
    private string resource;
    private bool disposed = false; // To detect redundant calls to Dispose()

    public MyClass(string resourceName)
    {
        resource = resourceName;
    }

    ~MyClass()
    {
        Console.WriteLine("Destructor called");
        Dispose(false);
    }

    public void Dispose()
    {
        Console.WriteLine("Disposer called");
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                Console.WriteLine("Disposing managed resources.");
            }
            Console.WriteLine("Disposing unmanaged resources.");
            disposed = true;
        }
    }
}

class Program
{
    static void Main(string[] args)
    {
        using (Destructible d = new Destructible())
        {
            Console.WriteLine("Using Destructible.");
            // ...
        }
        // after using-with-resources, d.Dispose() will be called
    }
}

C with GCC extensions

edit

The GNU Compiler Collection's C compiler comes with 2 extensions that allow implementing destructors:

  • The destructor function attribute[11] allows defining global prioritized destructor functions: when main() returns, these functions are called in priority order before the process terminates. See also: Hacking the art of exploitation.[12]
  • The cleanup variable attribute allows attaching a destructor function to a variable: the function is called when the variable goes out of scope.

Java

edit

Java provides 2 interfaces that implement destructors, java.lang.Closeable (deprecated) and java.lang.AutoCloseable. A class that implements AutoCloseable is able to be used in a "try-with-resources" block, available since Java 7.[13]

final class Destructible implements AutoCloseable {
    @Override
    public void close() {
        // cleanup code 
    }
}

public final class Example {
    try (Destructible d = new Destructible()) {
        System.out.println("Using Destructible.");
        // ...
    }
    // after try-with-resources, d.close() will be called
    
}

Prior to Java 7, a "try-finally" block was used.

final class Destructible {
    public void close() { 
        // cleanup code
    }
}

public final class Example {
    try {
        Destructible d = new Destructible();
        System.out.println("Using Destructible.");
    } finally {
        d.close()
    }
    
}

Historically, Java used Object.finalize() instead, however this has been deprecated. Java has a method called System.gc() to suggest the Java Virtual Machine (JVM) to perform garbage collection, which internally calls Runtime.getRuntime().gc(), which requests the garbage collector to trigger a garbage collection cycle, but this is not guaranteed, as the JVM manages memory independently. System.gc() may lead to finalize() being called, but only if the object is eligible for garbage collection and has a finalize() method.

class ParentFinalizerExample { ... }

class FinalizerExample extends ParentFinalizerExample {
    @Override
    protected void finalize() throws Throwable {
        try {
            System.out.println("finalize() called, cleaning up...");
        } finally {
            super.finalize(); // Always call super.finalize() to clean parent classes
        }
    }
}

public class Example {
    public static void main(String[] args) {
        FinalizerExample obj = new FinalizerExample ();
        obj = null;
        System.gc(); // Requests garbage collection (not guaranteed)
    }
}

Java also supports classes java.lang.ref.Cleaner and java.lang.ref.PhantomReference for safer low-level cleanup. Cleaner was introduced in Java 9 and is more efficient than PhantomReference, and works by registering an object with a cleaner thread which runs a cleanup action once the object is unreachable (i.e. no references to it exist).

import java.lang.ref.Cleaner;
import java.lang.ref.Cleaner.Cleanable;

class Resource {
    private static final Cleaner cleaner = Cleaner.create();

    static class State implements Runnable {
        private boolean cleaned = false;

        @Override
        public void run() {
            cleaned = true;
            System.out.println("Cleaned using Cleaner");
        }
    }

    private final State state;
    private final Cleanable cleanable;

    public Resource () {
        this.state = new State();
        this.cleanable = cleaner.register(this, state);
    }

    public void cleanup() {
        System.gc(); // Request garbage collection (not guaranteed)
    }
}

public class Example {
    public static void main(String[] args) {
        Resource resource = new Resource();
        resource = null;
        resource.cleanup();
    }
}

PhantomReference, since Java 1.2, is an older cleanup mechanism that uses a reference queue. PhantomReference is used solely for being notified that an object's garbage collection is pending. Once the object is garbage collected, the PhantomReference is enqueued into the ReferenceQueue. Unlike WeakReference which can be used to access the object if it still exists in memory, PhantomReference can only be used for detecting when an object will be destroyed. Both PhantomReference and WeakReference do not increase reference counts.

import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;

class Resource {
    private final String name;

    public Resource(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
}

public class PhantomReferenceExample {
    public static void main(String[] args) throws InterruptedException {
        Resource resource = new Resource("My resource");
        ReferenceQueue<Resource> queue = new ReferenceQueue<>();
        PhantomReference<Resource> phantomRef = new PhantomReference<>(resource, queue);

        resource = null;

        System.gc();

        Reference<? extends Resource> ref = queue.poll();
        if (ref != null) {
            System.out.printf("Object is ready to be collected: %s%n", ((PhantomReference<?>)ref).get());
        }
    }
}

Python

edit

Python supports destructors and has a del keyword, but unlike delete in C++, del only decreases the reference count of the object, and does not necessarily immediately destroy the object.

class Destructible:
    def __init__(self, name: str) -> 'Destructible':
        self.name = name
        print(f"Created Destructible: {self.name}")

    def __del__(self) -> None:
        print(f"Destructor called for: {self.name}")

if __name__ == "__main__":
    d: Destructible = Destructible("My name")
    print(f"Using Destructible: {d.name}")
    del d

Much like Java and C#, Python has a try-with-resources block, called a with block or a "context manager". It is used for things like files and network connections.

from typing import Optional

class Destructible:
    def __init__(self, name: str) -> None:
        self.name: str = name
    
    def __enter__(self) -> 'Destructible':
        print(f"Entering context (allocating resource: {self.name})")
        return self

    def __exit__(self, exc_type: Optional[type], exc_val: Optional[Exception], exc_tb: Optional[type]) -> None:
        print(f"Exiting context (cleaning up resource: {self.name})")

if __name__ == "__main__":
    with Destructible("Resource A") as d:
        print(f"Using resource {d.name} inside context")

    # Most Python standard library resources support with blocks:
    with open(file_path, 'r') as file:
        print("Reading the file content:")
        content: str = file.read()
        print(content)

Rust

edit

Rust does not have destructors in the sense of object-oriented programming, but a struct can implement the Drop trait and the drop method to clean itself up after it goes out of scope.

It is not possible to destroy objects explicitly through a delete operator like in C++, though it is possible to manually call drop() prematurely by using std::mem::drop().

use std::mem;

struct Destructible {
    name: String,
}

impl Destructible {
    fn new(name: String) -> Self {
        Destructible { name }
    }
}

impl Drop for Destructible {
    fn drop(&mut self) {
        println!("Dropping Destructible: {}", self.name);
    }
}

fn main() {
    {
        let resource_a: Destructible = Destructible::new(String::from("Resource A"));
        println!("Using Destructible.");
    } // <--- resource_a goes out of scope here, `drop()` is called automatically

    let resource_b: Destructible = Destructible::new(String::from("Resource B"));
    println!("Dropping Destructible prematurely.");
    mem::drop(resource_b);
}

While lifetimes control the validity of references, they do not determine when drop() is called.

Xojo

edit

Destructors in Xojo (REALbasic) can be in one of two forms. Each form uses a regular method declaration with a special name (with no parameters and no return value). The older form uses the same name as the Class with a ~ (tilde) prefix. The newer form uses the name Destructor. The newer form is preferred because it makes refactoring the class easier.

Class Foobar
  // Old form
  Sub ~Foobar()
  End Sub

  // New form
  Sub Destructor()
  End Sub
End Class

See also

edit

References

edit
  1. ^ "dtor". TheFreeDictionary.com. Retrieved 2025-08-06.
  2. ^ a b c d e Sebesta, Robert W. (2012). ""11.4.2.3 Constructors and Destructors"". Concepts of Programming Languages (print) (10th ed.). Boston, MA, USA: Addison-Wesley. p. 487. ISBN 978-0-13-139531-2.
  3. ^ "Finalizers (C# Programming Guide)".
  4. ^ Constructors and Destructors, from PHP online documentation
  5. ^ "3. Data model — Python 2.7.18 documentation".
  6. ^ "3. Data model — Python 3.10.4 documentation".
  7. ^ "Destructors - the Rust Reference".
  8. ^ GotW #47: Uncaught exceptions Accessed 31 July 2011.
  9. ^ Smith, Richard; Voutilainen, Ville. "P0593R6:Implicit creation of objects for low-level object manipulation". open-std.org. Retrieved 2025-08-06.
  10. ^ Scott Meyers: Effective Modern C++, O'REILLY, ISBN 9781491903995
  11. ^ C "destructor" function attribute
  12. ^ Erickson, Jon (2008). Hacking the art of exploitation. No Starch Press. ISBN 978-1-59327-144-2.
  13. ^ Bloch, Joshua (2018). Effective Java (3rd ed.). Addison-Wesley. pp. 29–31. ISBN 978-0134685991.
转氨酶高吃什么好得快 新五行属什么 捋一捋是什么意思 蚊子不喜欢什么血型 责成是什么意思
生物制剂是什么药 梦到自己长白头发是什么意思 金银花不能和什么一起吃 青城之恋是什么生肖 27度穿什么衣服合适
这是什么石头 左下眼皮跳是什么原因 什么可以美白牙齿 乙肝两对半阳性是什么意思 嗳气吃什么药
取环前需要做什么检查 吃什么能去黑眼圈 将星是什么意思 梦到黑狗是什么意思 什么人不能吃鹅蛋
男人吃什么增大增长hcv9jop3ns2r.cn 什么叫十二指肠球炎hcv7jop9ns7r.cn 卵巢结节是什么意思hcv9jop6ns9r.cn 心梗是什么症状hcv7jop6ns6r.cn 轶是什么意思hcv7jop5ns0r.cn
胆固醇是什么东西hkuteam.com 脸色暗沉发黑什么原因hcv8jop7ns1r.cn 小孩肺炎吃什么药naasee.com 九浅一深什么意思hcv7jop4ns6r.cn 舰长是什么级别hcv8jop5ns6r.cn
抗sm抗体阳性什么意思hcv8jop7ns6r.cn 经常射精有什么伤害hcv9jop2ns7r.cn 什么是食品添加剂hcv8jop3ns4r.cn tvb是什么hcv8jop2ns0r.cn 流清水鼻涕是什么感冒hcv9jop4ns7r.cn
2038年是什么年wzqsfys.com 女性下面流水什么原因hcv9jop7ns5r.cn 蓝矾对人有什么危害hcv8jop6ns7r.cn cod是什么hcv7jop6ns1r.cn 柠檬吃多了有什么坏处hcv8jop1ns3r.cn
百度